scala - Apache Spark 中的 reduce() 与 Fold()

标签 scala apache-spark rdd reduce fold

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

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

  • 有人可以介绍一下这两个操作的用例吗?
  • 在考虑使用 0 进行 fold 的情况下,哪种效果会更好?

提前致谢。

最佳答案

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

  • RDD.fold 操作在分区 Iterators 上使用 fold,而分区 Iterators 是使用 foldLeft 实现的。<
  • 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? 中找到一些讨论。

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

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

关于scala - Apache Spark 中的 reduce() 与 Fold(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056895/

相关文章:

scala - Akka HTTP 客户端 websocket 流的定义

python - 包装 pyspark Pipeline.__init__ 和装饰器

scala - 在分区数据上运行 groupByKey/reduceByKey,但使用不同的键

apache-spark - 每天自动更新 Hive View

apache-spark - 如何在多列上编写 Pyspark UDAF?

apache-spark - 如何检查点RDD

Scala Spark RDD、数据集、RDD 对和分区

class - 我如何在 Scala 中引用未实例化的类?

scala - 2.10 的嵌入式 Scala REPL 解释器示例

scala - 在 Apache Spark (Scala) 中使用 reduceByKey