gpt4 book ai didi

java - 对值进行两次迭代 (MapReduce)

转载 作者:太空狗 更新时间:2023-10-29 22:31:27 24 4
gpt4 key购买 nike

我收到一个迭代器作为参数,我想对值进行两次迭代。

public void reduce(Pair<String,String> key, Iterator<IntWritable> values,
Context context)

这可能吗?如何 ?签名是由我使用的框架(即 Hadoop)强加的。

-- 编辑--
最后,reduce 方法的真正签名是带有一个iterable。我被这个误导了wiki page (这实际上是我发现的唯一未弃用(但错误)的 wordcount 示例)。

最佳答案

不幸的是,如果不缓存 Andreas_D 的回答中的值,这是不可能的。

即使使用新的 API,Reducer 接收的是 Iterable 而不是 Iterator,您也无法迭代两次。尝试类似的东西非常诱人:

for (IntWritable value : values) {
// first loop
}

for (IntWritable value : values) {
// second loop
}

但这实际上行不通。您从 Iterableiterator() 方法收到的 Iterator 是特殊的。这些值可能并不都在内存中; Hadoop 可能正在从磁盘流式传输它们。它们并非真正由 Collection 支持,因此允许多次迭代并非易事。

您可以在 ReducerReduceContext 代码中亲眼看到这一点。

将值缓存在某种类型的 Collection 中可能是最简单的答案,但如果您在大型数据集上操作,则很容易造成堆内存不足。如果您可以向我们提供有关您的问题的更多细节,我们或许可以帮助您找到不涉及多次迭代的解决方案。

关于java - 对值进行两次迭代 (MapReduce),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6111248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com