Reducer中的ArrayList问题



嗨,我正在执行一些计算在减速器和试图加载数据到数组列表。当我在后面的代码点对ArrayList执行get操作时,ArrayList中的所有对象都具有相同的值。

public ArrayList<some_class> temp = new ArrayList<some_class>();
//This is global variable
@Override
public void reduce(Key_class key, Iterator<some_class> values,
        OutputCollector<Text, Text> output, Reporter reporter)
                throws IOException {
    if(this.output==null){
        this.output=output;
    }
    while(values.hasNext())
    {
                    //if i print here
                    //and do the following values.next().val1
                    //I'm getting the right result
        temp.add(values.next());
    }
    System.out.println(temp.get(0).val1);//Wrong result
}

我得到的输出如下:12/10/2012 1312/10/2012 13

实际输出应该是:12/10/2012分12/10/2012 13

谢谢你的帮助。谢谢! !

值的实现是什么?出现这些症状的一个原因可能是values. next()总是返回对同一对象的引用,但会更改该对象的值以匹配迭代中的下一项。如果您无法访问其源代码,您可以通过在循环中打印value .next()结果的System.identityHashCode()来测试这种情况。

如果是这种情况,您需要修改Iterator的实现,使其每次返回不同的对象,或者需要在将对象添加到ArrayList之前克隆该对象。

就像@Patricia Shanahan已经注意到的那样,对象正在被重用——对象的底层内容正在被更新(但是所有的子对象等也被重用,这取决于你的readFields/write方法)。

你可以通过在将对象添加到ArrayList之前复制它们来解决这个问题:

@Override
public void reduce(Key_class key, Iterator<some_class> values,
    OutputCollector<Text, Text> output, Reporter reporter)
            throws IOException {
  if(this.output==null){
    this.output=output;
  }
  // you should out the arraylist to avoid unexpected behaviour and OOME
  temp.clear();
  while(values.hasNext())
  {
    // you'll need a copy of the configuration - conf
    temp.add(
        ReflectionUtils.copy(conf, values.next(), new some_class()));
  }
}

相关内容

  • 没有找到相关文章

最新更新