2014-04-10 14 views
6

Đang sử dụng hàm xếp hạng Pig 0.11.0 và tạo thứ hạng cho mỗi id trong dữ liệu của tôi. Tôi cần xếp hạng dữ liệu của mình theo một cách cụ thể. Tôi muốn thứ hạng đặt lại và bắt đầu từ 1 cho mỗi ID mới.Cách sử dụng hàm xếp hạng Apache Pig

Có thể sử dụng chức năng xếp hạng trực tiếp cho giống nhau không? Mọi mẹo sẽ được đánh giá cao.

dữ liệu:

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 

Về việc sử dụng chức năng cấp bậc như: op = dữ liệu thứ hạng bởi id, điểm số;

tôi nhận được kết quả này

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 

mong muốn 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 

Trả lời

10

Bạn có thể nhóm dữ liệu của mình theo id rồi sử dụng UDF Enumerate (DataFu) để nối thêm chỉ mục vào mỗi bộ của túi.

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 file jar có thể được tải về từ kho lưu trữ Trung ương Maven: http://search.maven.org/#search|ga|1|g%3A%22com.linkedin.datafu%22

1

Bạn có thể sử dụng hàm RANK như sau: B = rank A bằng giá DESC; bãi B;

Lưu ý: xem xét A có (id, xếp hạng) được đề cập trong ví dụ của bạn.

Các vấn đề liên quan