2012-02-03 109 views
5
grunt> dump jn; 

(k1,k4,10) 
(k1,k5,15) 
(k2,k4,9) 
(k3,k4,16) 

grunt> jn = group jn by $1; 
grunt> dump jn; 


(k4,{(k1,k4,10),(k2,k4,9),(k3,k4,16)}) 
(k5,{(k1,k5,15)}) 

現在,從這裏我想下面的輸出:豬排序查詢

(k4,{(k3,k4,16),(k1,k4,10)}) 
(k5,{(k1,k5,15)}) 

Bascially,我要作爲排序依據的數字:10,9,16,並選擇前2位的每一行。
我該怎麼做?

回答

9

這類似於此question,你可以使用一個Nested FOREACH,例如:

A = LOAD 'data'; 
jn = group A by $1; 
B = FOREACH jn { 
    sorted = ORDER A by $2 ASC; 
    lim = LIMIT sorted 2; 
    GENERATE lim; 
}; 
DUMP B; 
+2

你也可以使用的,而不是訂單和限制TOP()函數。它在Pig <0.8和piginbank for> = 0.8 – NerdyNick 2012-02-28 02:57:34

+0

我有類似的問題。 如果輸入是{10,5,5,1,2} 我使用TOP(),但是在TOP(2)中我期望我的輸出爲{10,5,5} ,但其實際{10,5} 我怎麼解決這個問題? – sudheer 2013-10-21 09:59:58

+1

不應該由DESC的排序順序?因爲前2名被要求? – 2015-11-11 06:30:32