如何在映射器中存储值?

时间:2015-11-04 11:54:26

标签: java hadoop mapreduce aggregation binning

我是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中一样?可以理解代码示例或对其他在线资源的引用。谢谢。

1 个答案:

答案 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的输出为TextIntWritable(来自map的每个bin的计数。)

如果作业中有多个Mappers,则可以在Mapper中汇总Reducer输出,每个键的Iterable<IntWritable>值的简单总和(Text )。