reduce
与 fold
在技术实现方面有何区别?
我知道它们的签名有所不同,因为 fold
接受附加参数(即初始值),这些参数会添加到每个分区输出中。
- 有人可以介绍一下这两个操作的用例吗?
- 在考虑使用 0 进行
fold
的情况下,哪种效果会更好?
提前致谢。
最佳答案
在性能方面没有任何实际差异:
RDD.fold
操作在分区Iterators
上使用fold
,而分区Iterators
是使用foldLeft
实现的。<RDD.reduce
在分区Iterators
上使用reduceLeft
。
这两种方法都使用 foldLeft
implemented like this 的简单循环来顺序保留可变累加器和处理分区。 :
foreach (x => result = op(result, x))
for (x <- self) {
if (first) {
...
}
else acc = op(acc, x)
}
Spark 中这些方法之间的实际差异仅与它们在空集合上的行为以及使用可变缓冲区的能力有关(可以说它与性能有关)。您可以在 Why is the fold action necessary in Spark? 中找到一些讨论。
而且整体处理模型没有什么区别:
- 每个分区均使用单个线程按顺序处理。
- 使用多个执行程序/执行程序线程并行处理分区。
- 最终合并是使用驱动程序上的单个线程按顺序执行的。
关于scala - Apache Spark 中的 reduce() 与 Fold(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056895/