scala并行集合不一致

Vas*_*sco 0 parallel-processing scala

我从下面的代码得到了不一致的答案,我觉得很奇怪.

import scala.math.pow

val p = 2
val a = Array(1,2,3)

println(a.par
    .aggregate("0")((x, y) => s"$y pow $p; ", (x, y) => x + y))

for (i <- 1 to 100) {
  println(a.par
    .aggregate(0.0)((x, y) => pow(y, p), (x, y) => x + y) == 14)
}

a.map(x => pow(x,p)).sum
Run Code Online (Sandbox Code Playgroud)

在代码中a.par ...计算14 10.任何人都可以解释为什么计算不一致吗?

fxl*_*lae 6

在您的"seqop"函数中,这是您传递给的第一个函数aggregate,您可以定义用于组合同一分区中的元素的逻辑.你的功能如下:

(x, y) => pow(y, p)
Run Code Online (Sandbox Code Playgroud)

问题是您不会累积分区的结果.相反,你扔掉你的累加器x.每次结果都是10,计算结果就会2^2被删除.

如果您更改功能以将累计值考虑在内,您每次都会得到14:

(x, y) => x + pow(y, p)
Run Code Online (Sandbox Code Playgroud)