Apache Spark中的reduce()与fold()

时间:2016-03-17 09:48:41

标签: scala apache-spark rdd reduce fold

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

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

  • 有人能说出这两个行为的用例吗?
  • 哪种情况会更好,在哪种情况下考虑0用于fold

提前致谢。

1 个答案:

答案 0 :(得分:5)

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

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

这两种方法都使用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?

中找到一些讨论

此外,整体处理模型没有差异:

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