2013-07-15 45 views
14

Tôi có dữ liệu đã nhóm lại và tổng hợp, có vẻ như vậy:Pig: Nhận giá trị n hàng đầu cho mỗi nhóm

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 
... 

Đối với mỗi người dùng (Alice và Bob), tôi muốn lấy hàng đầu của họ n giá trị (giả sử 2), sắp xếp các thuật ngữ 'đếm'. Vì vậy, sản lượng mong muốn tôi muốn là:

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

Làm cách nào để có thể thực hiện điều đó?

Trả lời

28

Một cách tiếp cận được

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); 
}; 

Input là:

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

Output là:

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

tuyệt vời, cảm ơn! Giới hạn – Hoff

+0

không đảm bảo rằng bạn sẽ nhận được các hồ sơ hàng đầu. –

+3

[docs] (https://pig.apache.org/docs/r0.7.0/piglatin_ref2.html#LIMIT) nói rằng thực hiện 'giới hạn' sau khi bạn đã đặt hàng' bộ sưu tập không đảm bảo bạn nhận được hồ sơ hàng đầu –

4

Tôi đã chỉ cần thực hiện một quan sát rằng

top = limit sorted 2; 

đầu là một chức năng sẵn có và có thể ném ra một lỗi do đó, điều duy nhất mà tôi đã làm được đổi tên của mối quan hệ trong trường hợp này và thay vì

generate group, flatten(top); 

được đưa ra đầu ra

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

sửa đổi đó như hình dưới đây -

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); 
}; 

đó đã cho tôi kết quả mong muốn theo yêu cầu của bạn -

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

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn câu trả lời .... – Ankit