hadoop层叠如何获取前n个元组

yqyhoc1h  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(279)

对层叠还不熟悉,正在尝试找到一种基于排序/顺序获取前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中似乎很容易做到,但是很难找到一种级联方式。请告知!

zqdjd7g9

zqdjd7g91#

假设您只需要设置管道,了解如何执行此操作:
在级联2.1.6中,

Pipe firstNamePipe = new GroupBy("topFirstNames", InPipe,  
                                 new Fields("first_name"),
                                 );

firstNamePipe = new Every(firstNamePipe, new Fields("first_name"), 
                          new Count("num_records"), Fields.All);

firstNamePipe = new GroupBy(firstNamePipe,  
                                 new Fields("first_name"),
                                 new Fields("num_records"),
                                 true); //where true is descending order

firstNamePipe = new Every(firstNamePipe, new Fields("first_name", "num_records")
                          new First(Fields.Args, 100), Fields.All)

其中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)

z9ju0rcb

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

相关问题