reduce() 与 Apache Spark 中的 fold()

reduce() vs. fold() in Apache Spark

reducefold 在技术实施方面有何区别?

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

提前致谢。

在性能方面没有任何实际差异:

  • RDD.fold 操作在使用 foldLeft.
  • 实现的分区 Iterators 上使用 fold
  • RDD.reduce 正在分区 Iterators.
  • 上使用 reduceLeft

这两种方法都保持可变累加器并使用简单循环按顺序处理分区 foldLeft implemented like this:

foreach (x => result = op(result, x))

reduceLeft like this:

for (x <- self) {
  if (first) {
    ...
  }
  else acc = op(acc, x)
}

Spark 中这些方法之间的实际区别仅与它们在空集合上的行为和使用可变缓冲区的能力有关(可以说与性能有关)。您会在 Why is the fold action necessary in Spark?

中找到一些讨论

而且整体处理模型也没有什么区别:

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