有什么区别reduce
vs. fold
关于它们的技术实现?
我知道他们的签名不同fold
接受添加到每个分区输出的附加参数(即初始值)。
- 有人可以讲述这两个操作的用例吗?
- 在考虑使用 0 的情况下哪个会表现更好
fold
?
提前致谢。
就性能而言,没有任何实际差异:
-
RDD.fold
行动正在使用fold
在分区上Iterators
这是使用实现的foldLeft
.
-
RDD.reduce
正在使用reduceLeft
在分区上Iterators
.
两种方法都使用简单的循环来保持可变累加器和顺序处理分区foldLeft像这样实施 https://github.com/scala/scala/blob/2.12.x/src/library/scala/collection/TraversableOnce.scala#L155:
foreach (x => result = op(result, x))
and reduceLeft像这样 https://github.com/scala/scala/blob/2.12.x/src/library/scala/collection/TraversableOnce.scala#L178:
for (x <- self) {
if (first) {
...
}
else acc = op(acc, x)
}
Spark 中这些方法之间的实际差异仅与它们在空集合上的行为以及使用可变缓冲区的能力有关(可以说它与性能有关)。你会发现一些讨论为什么 Spark 中需要折叠操作? https://stackoverflow.com/q/34529953/1560062
而且整体处理模型没有区别:
- 每个分区都使用单个线程顺序处理。
- 使用多个执行器/执行器线程并行处理分区。
- 最终合并是使用驱动程序上的单个线程顺序执行的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)