1

我正在测试一个简单的 mapreduce 应用程序,但我有点难以理解当我迭代 reduce 调用的输入值时会发生什么。

这是一段行为奇怪的代码..

public void reduce(Text key, Iterable<E> values, Context context)
    throws IOException, InterruptedException{

    Iterator<E> iterator = values.iterator();
    E first = (E)statesIter.next();

    while(statesIter.hasNext()){
        E state = statesIter.next();

        System.out.println(first.toString());
        // some other stuff
    }
    // some other stuff
}

所以没什么奇怪的......除了每个 println 调用实际上打印一个不同的字符串这一事实。因此,每次我调用该next()方法时,所引用的对象都会first发生变化。

那么为什么会出现这种奇怪的行为呢?

4

1 回答 1

4

这有点违反直觉,但它实际上记录在 API 文档中——Hadoop 重用键/值,如果你想保留它们,你应该克隆它们。

于 2013-04-12T17:07:58.250 回答