2014-04-10 8 views
6

पिग 0.11.0 रैंक फ़ंक्शन का उपयोग कर रहा हूं और मेरे डेटा में प्रत्येक आईडी के लिए रैंक उत्पन्न कर रहा हूं। मुझे किसी विशेष तरीके से अपने डेटा की रैंकिंग की आवश्यकता है। मैं रैंक को रीसेट करना चाहता हूं और प्रत्येक नई आईडी के लिए 1 से शुरू करना चाहता हूं।अपाचे पिग रैंक फ़ंक्शन का उपयोग

क्या रैंक फ़ंक्शन का उपयोग सीधे इसके लिए करना संभव है? किसी भी सुझाव की सराहना की जाएगी।

डाटा:

id,rating 
X001, 9 
X001, 9 
X001, 8 
X002, 9 
X002, 7 
X002, 6 
X002, 5 
X003, 8 
X004, 8 
X004, 7 
X004, 7 
X004, 4 

तरह रैंक फ़ंक्शन का उपयोग पर: आईडी के आधार पर = रैंक डेटा सेशन, स्कोर;

मैं इस आउटपुट प्राप्त

rank,id,rating 
1, X001, 9 
1, X001, 9 
2, X001, 8 
3, X002, 9 
4, X002, 7 
5, X002, 6 
6, X002, 5 
7, X003, 8 
8, X004, 8 
9, X004, 7 
9, X004, 7 
10, X004, 4 

वांछित ओ/पी:

rank,id,rating 
1, X001, 9 
1, X001, 9 
2, X001, 8 
1, X002, 9 
2, X002, 7 
3, X002, 6 
4, X002, 5 
1, X003, 8 
1, X004, 8 
2, X004, 7 
2, X004, 7 
3, X004, 4 

उत्तर

10

आप आईडी द्वारा अपना डेटा समूहित कर सकते हैं तो बैग के प्रत्येक टुपल को इंडेक्स जोड़ने के लिए यूडीएफ Enumerate (डेटाफू) का उपयोग करें।

register datafu-1.1.0.jar; 
define Enumerate datafu.pig.bags.Enumerate('1'); 

data = load 'data' using PigStorage(',') as (id:chararray, rating:int); 
data = group data by id; 
data = foreach data { 
    sorted = order data by rating DESC; 
    generate group, sorted; 
} 
data = foreach data generate FLATTEN(Enumerate(sorted)); 
data = foreach data generate $2, $0, $1; 
dump data; 

DataFu जार फ़ाइल Maven केंद्रीय भंडार से डाउनलोड किया जा सकता है: http://search.maven.org/#search|ga|1|g%3A%22com.linkedin.datafu%22

1

आप नीचे के रूप में रैंक फ़ंक्शन का उपयोग कर सकते हैं: रेटिंग DESC द्वारा बी = रैंक एक; डंप बी;

नोट: आपके उदाहरण में उल्लिखित एक आईडी (आईडी, रेटिंग) पर विचार करें।

संबंधित मुद्दे