2014-04-10 20 views
6

Używam funkcji rangowania Pig 0.11.0 i generowania rang dla każdego id w moich danych. Potrzebuję rankingu moich danych w określony sposób. Chcę, aby ranga została zresetowana i zaczynała się od 1 dla każdego nowego identyfikatora.Użycie funkcji rankingu Apache Pig

Czy można użyć funkcji rang bezpośrednio dla tego samego? Wszelkie wskazówki byłyby mile widziane.

danych:

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 

Z użyciem funkcji rangi takie jak: op = dane rangi o identyfikatorze wynik;

uzyskać to wyjście

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 

Pożądany 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 

Odpowiedz

10

Możesz pogrupować swoje dane według id, a następnie użyć UDF Enumerate (DataFu) do dołączenia indeksu do każdej krotki torebek.

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 plik jar można pobrać z repozytorium Maven Środkowej: http://search.maven.org/#search|ga|1|g%3A%22com.linkedin.datafu%22

1

Można użyć funkcji RANK jak poniżej: B = rangi wg rankingu DESC; dump B;

Uwaga: biorąc pod uwagę posiadanie (identyfikator, ocena) wspomnianego w przykładzie.