我的数据的每一行都是一年和一些字符的字符串连接。 我想获得每年降序排列的前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名? 有更好的方法来完成这项工作吗?