我已经定义了一个自定义可写(称为 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
答案 0 :(得分:0)
在readFields
方法中,您需要清除数组列表的任何先前内容 - Hadoop在调用之间重新使用相同的对象。
抱歉,我错过了your previous post:
@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);
}
}