Spark:Reduce()与Fold()之间的区别[重复]

Posted

技术标签:

【中文标题】Spark:Reduce()与Fold()之间的区别[重复]【英文标题】:Spark: Difference Between Reduce() vs Fold() [duplicate] 【发布时间】:2019-03-05 00:32:29 【问题描述】:

我正在学习 Spark 使用 Learning Spark,Lightning-Fast 数据分析书

我去过很多网站,看了很多文章,但我还是不明白reduce()fold()之间的区别。

根据我正在使用的书:

“与reduce() 类似的是fold(),它也采用与reduce() 所需的签名相同的函数,但另外需要一个“零值”用于每个分区的初始调用。您提供的零值应该是您的操作的标识元素;也就是说,在您的函数中多次应用它不应更改该值(例如,0 表示 +,1 表示 *,或空列表表示连接)。"

为了帮助我更好地理解,我运行以下代码:

rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2)

rdd.getNumPartitions()
Out[1]: 2

rdd.glom().collect()
Out[2]: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

rdd.reduce(lambda x,y: x+y)
Out[3]: 55

rdd.fold(0, lambda x,y: x+y)
Out[4]: 55

问题: 1)引用:“但另外需要一个“零值”用于每个分区的初始调用。”每个分区的初始调用是什么意思?

2)引用:“您提供的零值应该是您操作的标识元素;也就是说,在您的函数中多次应用它不应该改变值”如果是这样,那么提供“操作的价值”?

3)根据我上面提供的例子,两者的总和都是55。有什么区别?

【问题讨论】:

还有 foldLeft 和 FoldRight 需要考虑。 【参考方案1】:

不同之处在于 fold 允许您更改结果的类型,而 reduce 不能,因此可以使用数据中的值。 例如

rdd.fold("",lambda x,y: x+str(y))
'12345678910'

您的示例不会更改结果的类型,实际上在该示例中,您可以使用 reduce 而不是 fold。

在非分布式环境中使用的“正常”折叠使用一次初始值。但是,随着 spark 运行分布,它将运行一个折叠,该折叠将从每个分区中的初始值开始,并在组合结果时再次 因为在您的示例中,如果我们调用以下代码,您已经在 2 个分区中创建了上述 10 个数字:

rdd.fold("HERE",lambda x,y: x+str(y))

我们会得到

'HEREHERE12345HERE678910'

【讨论】:

以上是关于Spark:Reduce()与Fold()之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

F#:啥叫做 map 和 fold 的组合,或者 map 和 reduce 的组合?

Kotlin中折叠和减少之间的区别,何时使用?

Spark的两种核心Shuffle详解

Spark的两种核心Shuffle详解

技术浅谈MapReduce 与函数式编程

type 类型的 Spark reduceByKey(arguments) 不适用于参数 arguments