1

对于这个例子,spark reduce 是如何工作的?

val num = sc.parallelize(List(1,2,3))
val result = num.reduce((x, y) => x + y)
res: Int = 6


val result = num.reduce((x, y) => x + (y * 10))
res: Int = 321

我了解第一个结果(1 + 2 + 3 = 6)。对于第二个结果,我认为结果会是 60,但事实并非如此。有人可以解释吗?

Step1 : 0 + (1 * 10) = 10
Step2 : 10 + (2 * 10) = 30
Step3 : 30 + (3 * 10) = 60

更新:根据 Spark 文档:

该函数应该是可交换的和关联的,以便可以并行正确计算。

https://spark.apache.org/docs/latest/rdd-programming-guide.html

4

1 回答 1

2
(2,3) -> 2 + 3 * 10 = 32 
(1,(2,3)) -> (1,32) -> 1 + 32 * 10 = 321

一个reducer(一般来说,不仅仅是Spark),接受一对,应用reduce函数并获取结果并将其再次应用于另一个元素。直到所有元素都被应用。顺序是特定于实现的(如果并行,甚至是随机的),但通常,它不应该影响最终结果(交换和关联)。

还要检查这个https://stackoverflow.com/a/31660532/290036

于 2019-09-25T19:23:08.757 回答