【问题标题】:How to bin values in the mapper?如何在映射器中合并值?
【发布时间】:2016-02-04 21:50:55
【问题描述】:

我是 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 清理、Combiner 还是在 Reducer 中执行?代码示例或对其他在线资源的引用将不胜感激。谢谢你。

【问题讨论】:

    标签: java hadoop mapreduce aggregation binning


    【解决方案1】:

    众所周知,数据需要分箱到三个箱中。这些 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 读取数据时,它将更新 map 中各个 bin 的计数。然后在cleanup()方法中写下这个map。 Mapper 的输出是TextIntWritable(这是map 中每个bin 的计数)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2016-06-08
      • 2011-04-08
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多