阿帕奇猪关于排序前n

时间:2014-12-22 15:04:26

标签: apache-pig

最近我尝试使用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
.
.

如果我想输出前3,它还需要在结果中包含D,8 E,8,但猪脚本语言中的LIMIT不能这样做。是否有人使用猪语言处理问题,或者必须编写UDF函数来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

Limit不适用于您的情况,您必须使用RANKFILTER运算符。

<强> data.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

<强> PigScript:

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)