2012-02-03 44 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)}) 

Bây giờ, từ đây tôi muốn đầu ra sau đây:Pig Sắp xếp theo Query

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

Bascially, tôi muốn sắp xếp vào những con số: 10,9,16 và chọn top 2 cho mỗi hàng .
Tôi làm cách nào?

Trả lời

9

này tương tự như question này và bạn có thể sử dụng một Nested FOREACH, ví dụ .:

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

Bạn cũng có thể chỉ cần sử dụng TOP() chức năng thay vì ORDER và LIMIT. Của nó trong piggybank cho Pig <0,8 và buildin cho> = 0,8 – NerdyNick

+0

Tôi có vấn đề tương tự. Tôi đang sử dụng TOP() nhưng trong TOP (2) nếu đầu vào là {10,5,5,1,2} Tôi mong đợi sản lượng của tôi là {10,5,5} nhưng thực tế {10,5} của nó Tôi có thể giải quyết vấn đề này bằng cách nào? – sudheer

+1

Không nên sắp xếp thứ tự sắp xếp theo DESC? Vì 2 yêu cầu hàng đầu? –