如何使用mapreduce作业汇总和显示前n个项目

时间:2019-06-18 18:14:21

标签: java hadoop mapreduce

我的数据的每一行都是一年和一些字符的字符串连接。 我想获得每年降序排列的前3个字符。

我的输入就像:

2012,A,B,C
2000,C,A,Q,E,P
2001,A,P,B
2000,A,B
2000,A,B,C,D
2012,A, D

我想要的是这样的输出:

2000: A 4, B 3, C 2
2001: A 1, P 1, B 1
2012: C 2, A 1 , B 1

我做了什么:

1)映射器

String[] words = value.toString().split( ",");
IntStream.range(1, words.length).parallel().forEach(i -> 
context.write(new SimpleEntry<String,String>(words[0], words[i]), new IntWritable(1));)

My mapper's output is: 
key : 2012,A value : 1
key : 2012,B value : 1
key : 2012,C value : 1
key : 2000,C value : 1
key : 2000,A value : 1
key : 2000,Q value : 1
key : 2000,E value : 1
key : 2000,P value : 1
...

2)减速器(我使用了预定义的IntSumReducer)。输出为:

key : 2012,A value : 1
key : 2012,B value : 1
key : 2012,C value : 2
key : 2000,C value : 2
key : 2000,A value : 4
key : 2000,Q value : 1
key : 2000,E value : 1
key : 2000,P value : 1
...

现在我认为我可以将另一个映射器与

这样的输出链接起来
key : 2012 value : A,1
key : 2012 value : B,1
key : 2012 value : C,1
key : 2000 value : C,1
key : 2000 value : A,1
key : 2000 value : Q,1
key : 2000 value : E,1
key : 2000 value : P,1
...

,然后是化简器以连接给定键的值。 输出看起来像

2000: E 1, B 3, C 2, Q 1, A 4, P 1
2001: A 1, P 1, B 1
2012: C 2, A 1 , B 1
...

如何按降序对值进行排序并获得前3名? 有更好的方法来完成这项工作吗?

0 个答案:

没有答案