1

我有一个方法,它作为参数有一个集合的迭代器。在我要复制集合的方法中,迭代器“指向”。然而,只有最后一个集合条目出现在集合副本中,它存在 N 次,其中 N 是原始集合的大小。

public void someMethod(Iterator<Node> values) {
  Vector<Node> centralNodeNeighbourhood = new Vector<Node>();
  while (values.hasNext()) {
    Node tmp = values.next();
    centralNodeNeighbourhood.add(tmp);
  }
  ...
  //store the centralNodeNeighbourhood on disk
}

示例“原始集合”:

1
2
3

示例“centralNodeNeighbourhood 集合”:

3
3
3

有人可以指出我的错误吗?我无法更改方法 args,我只能将 Iterator 获取到集合中,对此无能为力。

更新(回答一些问题)

while (values.hasNext()) {
            Node tmp = values.next();
            System.out.print("Adding = "+tmp.toString());
            centralNodeNeighbourhood.add(tmp);
        }

打印正确的原始集合元素。我不知道原始集合是什么类型,但 Iterator 来自 std java。方法是

public class GatherNodeNeighboursInfoReducer extends MapReduceBase
        implements Reducer<IntWritable, Node, NullWritable, NodeNeighbourhood>{
    public void reduce(IntWritable key, Iterator<Node> values,
                   OutputCollector<NullWritable, NodeNeighbourhood> output, Reporter reporter) throws IOException {...}
}

来自 OLD Hadoop api 的方法(Hadoop 版本 0.20.203.0)

已解决我在每次迭代时制作了 tmp 对象的副本,并将此副本添加到 centralNodeNeighbourhood 集合中。这解决了我的问题。感谢您的所有(快速)帮助。

4

2 回答 2

3

Iterator 似乎每次都返回相同的 Node 对象。如果是这样,您需要在将其添加到集合之前获取节点的副本。(否则,您每次都将添加相同的对象,并且它将具有设置为的最后一个值)

于 2011-11-29T18:03:22.073 回答
1

Hadoop 的reduce方法指定它在其迭代器中重用值对象。这是一件可怕的事情,但它就是这样做的。

框架将重用传递给 reduce 的键和值对象,因此应用程序应该克隆他们想要保留副本的对象。在许多情况下,所有值都组合成零或一个值。

于 2011-11-29T18:43:07.923 回答