Apache Spark中的reduce()与fold()

Sha*_*shi 6 reduce scala fold apache-spark rdd

reducefold技术实施之间的区别是什么?

我知道它们的签名不同,因为它们fold接受附加的参数(即初始值),该参数被添加到每个分区输出中。

  • 有人可以告知这两个操作的用例吗?
  • 考虑将0用作哪种方案,哪种方案会更好fold

提前致谢。

zer*_*323 7

在性能方面,没有任何实际区别:

  • RDD.fold操作正在使用fold实施的分区Iterators上使用foldLeft
  • RDD.reducereduceLeft在分区上使用Iterators

两种方法都使用简单的循环依次保持可变的累加器和进程分区,foldLeft实现方式如下

foreach (x => result = op(result, x))
Run Code Online (Sandbox Code Playgroud)

reduceLeft像这样

for (x <- self) {
  if (first) {
    ...
  }
  else acc = op(acc, x)
}
Run Code Online (Sandbox Code Playgroud)

Spark中这些方法之间的实际差异仅与它们在空集合上的行为以及使用可变缓冲区的能力有关(可以说,这与性能有关)。您将在Spark为什么需要折叠动作中找到一些讨论

此外,整体处理模型没有区别:

  • 每个分区使用单个线程顺序处理。
  • 使用多个执行程序/执行程序线程并行处理分区。
  • 使用驱动程序上的单个线程顺序执行最终合并。