就技术实现而言,reduce
与fold
有什么区别?
我知道它们的签名有所不同,因为fold
接受附加参数(即初始值),该参数会添加到每个分区输出中。
fold
中使用0的情况下,哪个会表现更好? 提前致谢。
最佳答案
在性能方面,没有任何实际差异:
RDD.fold
操作在分区fold
上使用Iterators
,分区foldLeft
是使用RDD.reduce
实现的。 reduceLeft
在分区Iterators
上使用foldLeft
。 两种方法都使用带有
reduceLeft
implemented like this的简单循环来保持可变的累加器和顺序处理分区:foreach (x => result = op(result, x))
和 ojit_code like this:
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/