最近我尝试使用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>
答案 0 :(得分:0)
Limit
不适用于您的情况,您必须使用RANK
和FILTER
运算符。
<强> 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)