Spark:Reduce()与Fold()之间的区别

时间:2018-09-29 04:05:25

标签: apache-spark reduce fold

我正在使用《学习Spark》(闪电快速数据分析书)研究《火花》。

我去过很多网站,读过许多文章,但我仍然不了解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。有什么区别?

1 个答案:

答案 0 :(得分:2)

区别在于,折叠可让您更改结果的类型,而reduce则不能,因此可以使用数据中的值。 例如

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

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

在非分布式环境中使用的“常规”折叠使用初始值一次。但是,随着火花运行的分散,它将进行折叠,折叠操作将从每个分区的初始值开始,然后在合并结果时再次 因为在您的示例中,您将在以下两个分区中创建了上面的10个数字:

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

我们会得到

'HEREHERE12345HERE678910'