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

Теперь здесь я хочу следующий вывод:Pig Заказывайте Запрос

(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() вместо порядка и LIMIT. Его в piggybank для Свинья <0.8 и buildin in для> = 0,8 – NerdyNick

+0

У меня есть аналогичная проблема. Я использую TOP(), но в TOP (2), если input {10,5,5,1,2} Я ожидаю, что мой результат будет {10,5,5} , но его {10,5} на самом деле Как я могу это решить? – sudheer

+1

Не следует ли сортировать по DESC? Потому что запрашивается верхняя часть 2? –