2

我已经定义了一个自定义可写(称为EquivalenceClsAggValue),它在 Hadoop 中有一个 ArrayList 类型的字段(称为aggValues)。使用我的测试数据,Mapper 在 2 中为每个输出条目的aggValues的大小。但是,当我在 Reducer 中检查aggValues的大小时,它给了我不同的大小!也就是说,大小累加(第一个元素有 2,第二个有大小 4,第三个有大小 6,依此类推)。可能是什么问题?

这就是我在 Mapper 中的输出方式:

EquivalenceClsAggValue outputValue = new EquivalenceClsAggValue();
                .....

output.collect(new IntWritable(outputValue.aggValues.size()),outputValue);

在减速机中:

public void reduce(IntWritable key, Iterator<EquivalenceClsAggValue> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
     while(values.hasNext()){
            EquivalenceClsAggValue e = values.next();
            output.collect(new Text(key.toString()), new IntWritable(e.aggValues.size()));
.....

输出是:

2 2

2 4

2 6

4

1 回答 1

0

在您的readFields方法中,您需要清除数组列表的任何先前内容 - Hadoop 在调用之间重用相同的对象。

对不起,我在你之前的帖子中错过了这个:

@Override
public void readFields(DataInput arg0) throws IOException {
  // add this statement to clear out previous contents
  aggValues.clear();

  int size = arg0.readInt();

  for (int i=0;i<size;i++){
    SortedMapWritable tmp = new SortedMapWritable();
    tmp.readFields(arg0);
    aggValues.add(tmp);
  }       
}
于 2013-01-11T00:01:36.337 回答