2013-07-15 8 views
14

मैं डेटा कि पहले से ही वर्गीकृत किया और एकत्रित रहा है प्रति शीर्ष n मूल्यों जाओ, यह बहुत दिखाई देता है:सुअर: समूह

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

प्रत्येक उपयोगकर्ता (ऐलिस और बॉब), मैं उनके शीर्ष पुनः प्राप्त चाहते n मूल्यों के लिए (मान लें 2), 'गिनती' की क्रमबद्ध शर्तें। तो वांछित आउटपुट मैं चाहता हूँ यह है:

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

मैं ऐसा कैसे पूरा कर सकते हैं?

उत्तर

28

एक दृष्टिकोण है

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

इनपुट है:

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

आउटपुट है:

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

उत्कृष्ट, धन्यवाद! – Hoff

+0

सीमा गारंटी नहीं देता है कि आपको शीर्ष रिकॉर्ड प्राप्त होंगे। –

+3

[डॉक्स] (https://pig.apache.org/docs/r0.7.0/piglatin_ref2.html#LIMIT) कहता है कि संग्रह को ऑर्डर करने के बाद 'सीमा' करने से आप गारंटी देते हैं कि आपको शीर्ष रिकॉर्ड –

4

मैं सिर्फ एक अवलोकन बना दिया है कि

top = limit sorted 2; 

शीर्ष इनबिल्ट समारोह है और इसलिए केवल एक चीज है जो मैंने किया था इस मामले में संबंध का नाम बदल दिया गया था और बजाय

generate group, flatten(top); 

जो उत्पादन

(Alice,Alice,first,11) 
(Alice,Alice,second,10 
(Bob,Bob,first,21) 
(Bob,Bob,second,20) 
दे रहा था एक त्रुटि फेंक कर सकते हैं

संशोधित कि नीचे दिखाया गया है -

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

जो मुझे वांछित आउटपुट दे दी है के रूप में आप के लिए आवश्यक -

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

उम्मीद है कि इससे मदद मिलती है।

+0

उत्तर के लिए धन्यवाद .... – Ankit