【发布时间】:2019-03-05 00:32:29
【问题描述】:
我正在学习 Spark 使用 Learning Spark,Lightning-Fast 数据分析书。
我去过很多网站,看了很多文章,但我还是不明白reduce()和fold()之间的区别。
根据我正在使用的书:
“与reduce() 类似的是fold(),它也采用与reduce() 所需的签名相同的函数,但另外需要一个“零值”用于每个分区的初始调用。您提供的零值应该是您的操作的标识元素;也就是说,在您的函数中多次应用它不应更改该值(例如,0 表示 +,1 表示 *,或空列表表示连接)。"
为了帮助我更好地理解,我运行以下代码:
rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2)
rdd.getNumPartitions()
Out[1]: 2
rdd.glom().collect()
Out[2]: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
rdd.reduce(lambda x,y: x+y)
Out[3]: 55
rdd.fold(0, lambda x,y: x+y)
Out[4]: 55
问题: 1)引用:“但另外需要一个“零值”用于每个分区的初始调用。”每个分区的初始调用是什么意思?
2)引用:“您提供的零值应该是您操作的标识元素;也就是说,在您的函数中多次应用它不应该改变值”如果是这样,那么提供“操作的价值”?
3)根据我上面提供的例子,两者的总和都是55。有什么区别?
【问题讨论】:
-
还有 foldLeft 和 FoldRight 需要考虑。
标签: apache-spark reduce fold