我是Hadoop MapReduce的新手,我最近遇到了如何在映射器中对输出值进行分级的问题。我的映射器创建一个Text,IntWritable输出,其中数据集ID作为键,元数据描述的长度作为值。我的目标是将元数据长度的频率分为3组:1-200个字符,201-400个字符和401+个字符。输出文件如下所示(第一列是键,第二列是值 - 元数据的长度):
1 256
2 344
3 234
4 160
5 432
6 121
7 551
8 239
9 283
10 80
...
根据上面的值,应显示分箱结果:
1-200 3
201-400 5
401-... 2
关于如何处理它的任何想法?我应该像Mapper清理,组合器还是在Reducer中一样?可以理解代码示例或对其他在线资源的引用。谢谢。
答案 0 :(得分:0)
众所周知,数据需要分箱到三个箱中。这些bin可以在Mapper
中静态声明:
Text BIN1 = new Text("1-200"); // bin-1
Text BIN2 = new Text("200-400"); // bin-2
Text BIN3 = new Text("400-..."); // bin-3
现在在地图中创建HashMap<Text, Integer> map
。当Mapper读取数据时,它将更新bin
中相应map
的计数。然后在map
方法中写下此cleanup()
。 Mapper的输出为Text
和IntWritable
(来自map
的每个bin的计数。)
如果作业中有多个Mappers,则可以在Mapper
中汇总Reducer
输出,每个键的Iterable<IntWritable>
值的简单总和(Text
)。