在Hadoop Reducer中合并str值

时间:2017-10-19 23:28:36

标签: java hadoop hashmap google-cloud-platform

我的mapper类将输出键值对,如:

abc 1 
abc 2 
abc 1

我想合并这些值并使用HashMap计算reducer类中相同对的出现次数,输出如下:

abc 1:2 2:1 

但我的输出结果是:

abc 1:2:1 2:1:1

感觉有更多的字符串与输出结合,但我不知道为什么。

这是我的代码:

Text combiner = new Text();
StringBuilder strBuilder = new StringBuilder();

@Override
public void reduce(Text key, Iterable<Text> values,
                    Context context
                   ) throws IOException, InterruptedException {
    HashMap<Text, Integer> result = new HashMap<Text, Integer>();
    for (Text val : values) {
      if(result.containsKey(val)){
          int newVal = result.get(val) + 1;
          result.put(val, newVal);
      }else{
          result.put(val, 1);
      }
    }
    for(Map.Entry<Text, Integer> entry: result.entrySet()){
       strBuilder.append(entry.getKey().toString());
       strBuilder.append(":");
       strBuilder.append(entry.getValue());
       strBuilder.append("\t");
    }
    combiner.set(strBuilder.toString());
    context.write(key, combiner);
 }

1 个答案:

答案 0 :(得分:0)

我测试了这段代码,看起来还不错。你最有可能获得这样的输出是因为你也将这个减速器作为你的合成器运行,这可以解释为什么你得到三个值。联合收割机执行第一次连接,然后执行第二次连接。

您需要确保在作业设置中配置了 组合器。

我还建议您更改代码以确保在HashMap中存储Text值的新版本,请记住Hadoop将重用这些对象。所以你应该做的事情如下:

result.put(new Text(val), newVal);

或更改您的HashMap以存储字符串,这是安全的,因为它们是不可变的。