关于技术实现,reduce
和fold
有何不同?
据我了解,它们的签名不同,fold
接受额外的参数(即初始值),该值会添加到每个分区的输出中。
- 有人能讲解一下这两种操作的用例吗?
- 如果考虑使用0作为
fold
的参数,在哪种情况下哪种操作会表现更好?
先谢谢啦。
关于技术实现,reduce
和fold
有何不同?
据我了解,它们的签名不同,fold
接受额外的参数(即初始值),该值会添加到每个分区的输出中。
fold
的参数,在哪种情况下哪种操作会表现更好?先谢谢啦。
就性能而言,RDD.fold
操作使用 foldLeft
在分区的 Iterators
上执行 fold
,而 RDD.reduce
则是在分区的 Iterators
上使用 reduceLeft
。
这两种方法都保留可变累加器,并使用类似于 foldLeft
的简单循环顺序处理分区。
foreach (x => result = op(result, x))
并使用 reduceLeft
来实现:
for (x <- self) {
if (first) {
...
}
else acc = op(acc, x)
}
在Spark中,这些方法的实际区别仅与它们在空集合上的行为和使用可变缓冲区的能力有关(可以说这与性能相关)。在Why is the fold action necessary in Spark?中可以找到一些讨论。
此外,在整个处理模型方面没有区别:
fold
对每个分区的迭代器调用fold
,然后合并结果,reduce
对每个分区的迭代器调用reduceLeft
,然后合并结果。不同之处在于,fold
不需要担心空分区或集合,因为它将使用零值。性能差异可能甚至无法测量。 - The Archetypal Paul