apache pig关于排序top n

kfgdxczn  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(304)

最近我尝试使用pig对一些数据进行排序,下面是按计数排序数据的脚本(例如,我希望找到前3个):

in = load 'data.txt';
split = foreach in generate flatten(TOKENIZE((chararray)$0)) as tmp;
C = group split by tmp;
result = foreach C generate group, COUNT(split) as cnt;
des = ORDER result BY cnt DESC;
fin = LIMIT des 3;

然后输出如下:

A,10
B,9
C,8

但是如果我们有另一个计数也是8的数据,它就不能被输出。具体来说,当我键入dump des时,内容如下:

A,10
B,9
C,8
D,8
E,8
F,7
.
.

如果我想输出前三名,它还需要在结果中包含d,8e,8,但是pig脚本语言中的limit不能做到这一点。有没有人有使用pig语言处理问题的经验,或者必须编写一个udf函数来处理这个问题?

anauzrmj

anauzrmj1#

Limit 在你的情况下不起作用,你必须使用 RANK 以及 FILTER 接线员。
数据.txt

A,A,A,A,A,A,A,A,A,A
B,B,B,B,B,B,B,B,B
C,C,C,C,C,C,C,C
D,D,D,D,D,D,D,D
E,E,E,E,E,E,E,E
F,F,F,F,F,F,F

Pig手稿:

in = load 'data.txt';
sp = foreach in generate flatten(TOKENIZE((chararray)$0)) as tmp;
C = group sp by tmp;
result = foreach C generate group, COUNT(sp) as cnt;
myrank = RANK result BY cnt DESC DENSE;
top3 = FILTER myrank BY rank_result<=3;
finalOutput = FOREACH top3 GENERATE group,cnt;
DUMP finalOutput;

输出:

(A,10)
(B,9)
(C,8)
(D,8)
(E,8)

相关问题