2017-10-19 62 views
0

我的映射类将输出键值对,如:合并STR值在Hadoop中减速

abc 1 
abc 2 
abc 1 

我要合并的值,并计算出同一对减速机类的使用HashMap发生,输出像:

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); 
} 

回答

0

我测试了这个代码看起来OK。这样得到输出的最可能的原因是因为你也将这个reducer作为你的组合器来运行,这将解释你为什么得到三个值。联合收割机进行第一次连接,然后进行第一次连接。

您需要确保在作业设置中配置的组合器不是

我还建议你改变你的代码,以确保你在你的HashMap中存储了Text值的新版本,记得Hadoop将会重用这些对象。所以,你真的应该做这样的事情:

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

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