reduce() 与 Apache Spark 中的 fold()
reduce() vs. fold() in Apache Spark
reduce
与 fold
在技术实施方面有何区别?
我知道它们的签名不同,因为 fold
接受添加到每个分区输出的附加参数(即初始值)。
- 有人可以说说这两个操作的用例吗?
- 考虑将 0 用于
fold
? 在哪种情况下哪个表现更好
提前致谢。
在性能方面没有任何实际差异:
RDD.fold
操作在使用 foldLeft
. 实现的分区 Iterators
上使用 fold
RDD.reduce
正在分区 Iterators
. 上使用 reduceLeft
这两种方法都保持可变累加器并使用简单循环按顺序处理分区 foldLeft
implemented like this:
foreach (x => result = op(result, x))
for (x <- self) {
if (first) {
...
}
else acc = op(acc, x)
}
Spark 中这些方法之间的实际区别仅与它们在空集合上的行为和使用可变缓冲区的能力有关(可以说与性能有关)。您会在 Why is the fold action necessary in Spark?
中找到一些讨论
而且整体处理模型也没有什么区别:
- 使用单个线程按顺序处理每个分区。
- 使用多个执行器/执行器线程并行处理分区。
- 最终合并是使用驱动程序上的单个线程按顺序执行的。
reduce
与 fold
在技术实施方面有何区别?
我知道它们的签名不同,因为 fold
接受添加到每个分区输出的附加参数(即初始值)。
- 有人可以说说这两个操作的用例吗?
- 考虑将 0 用于
fold
? 在哪种情况下哪个表现更好
提前致谢。
在性能方面没有任何实际差异:
RDD.fold
操作在使用foldLeft
. 实现的分区 RDD.reduce
正在分区Iterators
. 上使用
Iterators
上使用 fold
reduceLeft
这两种方法都保持可变累加器并使用简单循环按顺序处理分区 foldLeft
implemented like this:
foreach (x => result = op(result, x))
for (x <- self) {
if (first) {
...
}
else acc = op(acc, x)
}
Spark 中这些方法之间的实际区别仅与它们在空集合上的行为和使用可变缓冲区的能力有关(可以说与性能有关)。您会在 Why is the fold action necessary in Spark?
中找到一些讨论而且整体处理模型也没有什么区别:
- 使用单个线程按顺序处理每个分区。
- 使用多个执行器/执行器线程并行处理分区。
- 最终合并是使用驱动程序上的单个线程按顺序执行的。