2014-04-10 13 views
6

Verwende die Pig 0.11.0 Rank Funktion und erzeuge Ränge für jede ID in meinen Daten. Ich brauche ein Ranking meiner Daten auf eine bestimmte Art und Weise. Ich möchte den Rang zurücksetzen und für jede neue ID von 1 beginnen.Verwendung der Apache Pig Rangfunktion

Ist es möglich, die Rangfunktion direkt für das gleiche zu verwenden? Irgendwelche Tipps würden geschätzt.

Daten:

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 

On mit Rang Funktion wie: op = Rangdaten von id, Partitur;

Ich erhalte diese Ausgabe

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 

Wunsch O/P:

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 

Antwort

10

Sie können Ihre Daten nach ID gruppieren und dann mithilfe der UDF Enumerate (DataFu) einen Index an jedes Tupel der Taschen anhängen.

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 JAR-Datei kann von Maven Zentrales Repository heruntergeladen werden: http://search.maven.org/#search|ga|1|g%3A%22com.linkedin.datafu%22

1

Sie können wie unten RANK-Funktion: B = Rang A nach Bewertung DESC; Dump B;

Hinweis: In diesem Beispiel wird A mit (id, rating) erwähnt.

Verwandte Themen