使用Apache Pig排名功能

时间:2014-04-10 11:42:56

标签: apache-pig

使用Pig 0.11.0 rank函数并为我的数据中的每个id生成排名。 我需要以特定方式对数据进行排名。我希望等级重置,并从每个新ID开始。

是否可以直接使用等级函数? 任何提示将不胜感激。

数据:

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

使用等级函数,如: op =按ID,得分排名数据;

我得到了这个输出

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

期望的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

2 个答案:

答案 0 :(得分:10)

您可以按ID对数据进行分组,然后使用UDF Enumerate(DataFu)将索引附加到每个包的元组。

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;

可以从Maven Central存储库下载DataFu jar文件:http://search.maven.org/#search|ga|1|g%3A%22com.linkedin.datafu%22

答案 1 :(得分:1)

您可以使用RANK功能,如下所示:     B =评级DESC的等级A;     转储B;

注意:考虑到你的例子中提到的A(id,rating)。