2013-07-15 13 views
14

mam dane, które już pogrupowane i sumarycznych, wygląda tak:Pig: Get najwyższej wartości n na grupę

user value  count 
---- -------- ------ 
Alice third  5 
Alice first  11 
Alice second  10 
Alice fourth  2 
... 
Bob  second  20 
Bob  third  18 
Bob  first  21 
Bob  fourth  8 
... 

Dla każdego użytkownika (Alicja i Bob), chcę odzyskać swoją top n wartości (powiedzmy 2), posortowane terminy "count". więc sygnał wyjściowy Chcę to:

Alice first 11 
Alice second 10 
Bob first 21 
Bob second 20 

Jak można tego dokonać?

Odpowiedz

28

Jedno podejście jest

records = LOAD '/user/nubes/ncdc/micro-tab/top.txt' AS (user:chararray,value:chararray,counter:int); 
grpd = GROUP records BY user; 

top3 = foreach grpd { 
     sorted = order records by counter desc; 
     top = limit sorted 2; 
     generate group, flatten(top); 
}; 

wejściowy jest:

Alice third 5 
Alice first 11 
Alice second 10 
Alice fourth 2 
Bob second 20 
Bob third 18 
Bob first 21 
Bob fourth 8 

wyjściowa wynosi:

(Alice,Alice,first,11) 
(Alice,Alice,second,10 
(Bob,Bob,first,21) 
(Bob,Bob,second,20) 
+0

świetnie, dzięki! Limit – Hoff

+0

nie gwarantuje, że otrzymasz najlepsze rekordy. –

+3

[docs] (https://pig.apache.org/docs/r0.7.0/piglatin_ref2.html#LIMIT) mówią, że wykonanie 'limitu' po' zamówieniu 'kolekcji gwarantuje, że otrzymasz top records –

4

Właśnie dokonał obserwacji, że

top = limit sorted 2; 

top jest wbudowana funkcja i może rzucać błąd więc jedyne co zrobiłem zmieniono nazwę związku w tym przypadku i zamiast

generate group, flatten(top); 

który dawał wyświetlamy

(Alice,Alice,first,11) 
(Alice,Alice,second,10 
(Bob,Bob,first,21) 
(Bob,Bob,second,20) 

Zmieniony że jak pokazano poniżej -

records = load 'test1.txt' using PigStorage(',') as (user:chararray, value:chararray, count:int); 
grpd = GROUP records BY user; 
top2 = foreach grpd { 
     sorted = order records by count desc; 
     top1 = limit sorted 2; 
     generate flatten(top1); 
}; 

który dał mi pożądany wynik wymagane przez ciebie -

(Alice,first,11) 
(Alice,second,10) 
(Bob,first,21) 
(Bob,second,20) 

Mam nadzieję, że to pomoże.

+0

Dzięki za odpowiedź .... – Ankit