对层叠还不熟悉,正在尝试找到一种基于排序/顺序获取前n个元组的方法。例如,我想知道人们使用的前100个名字。
以下是我可以在teradata sql中执行的类似操作:
select top 100 first_name, num_records
from
(select first_name, count(1) as num_records
from table_1
group by first_name) a
order by num_records DESC
在hadoop中也有类似的情况
a = load 'table_1' as (first_name:chararray, last_name:chararray);
b = foreach (group a by first_name) generate group as first_name, COUNT(a) as num_records;
c = order b by num_records DESC;
d = limit c 100;
在sql或pig中似乎很容易做到,但是很难找到一种级联方式。请告知!
2条答案
按热度按时间zqdjd7g91#
假设您只需要设置管道,了解如何执行此操作:
在级联2.1.6中,
其中inpipe是由传入的tap形成的,tap保存上面引用的元组数据。也就是“名字”num\u records”是在
new Count()
被称为。如果“num\u records”和“first\u name”数据位于不同的抽头(表或文件)中,那么可以设置指向这两个的两个管道
Tap
并使用CoGroup
.我使用的定义来自级联2.1.6:
子句
(String groupName, Pipe pipe, Fields groupFields, Fields sortFields, boolean reverseOrder)
计数(Fields fieldDeclaration)
第一(Fields fieldDeclaration, int firstN)
z9ju0rcb2#
方法1使用groupby并根据所需的列对它们进行分组,而u可以利用级联提供的二次排序,默认情况下它以升序提供它们,如果我们希望它们以描述顺序出现,则可以通过reverseorder()进行排序
获取前n个元组或行
它非常简单,只需在filter中使用一个静态变量count,每增加一个tuple count值,它就增加1,然后检查它是否大于n
当计数值大于n时返回true,否则返回false
这将为输出提供前n个元组
方法2
级联提供了一个inbuit函数,返回firstnbuffer
请参见下面的链接http://docs.cascading.org/cascading/2.2/javadoc/cascading/pipe/assembly/unique.html