2016-10-17 5 views
0

私は奇妙な次のコードから一貫性のない回答を得ています。コードa.par ...スカラー並列コレクションに一貫性がない

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 

14又は10を計算します。誰がコンピューティングが矛盾しているのかについて説明することはできますか?

答えて

6

aggregateに渡す最初の関数である "seqop"関数では、同じパーティション内の要素を結合するために使用されるロジックを定義します。関数は次のようになります。

(x, y) => pow(y, p) 

問題は、パーティションの結果が累積しないことです。代わりに、アキュムレータxを捨てます。結果として10を得るたびに、計算2^2は削除されました。

あなたが口座に積算値を取るためにあなたの関数を変更した場合は、14すべての時間を取得します:

(x, y) => x + pow(y, p) 
1

集計を使用する正しい方法は、(Xを使用することにより

a.par.aggregate(0.0)(
     (acc, value) => acc + pow(value, 2), (acc1, acc2) => acc1 + acc2 
    ) 

あり、 y)=> pow(y、2)、あなたはアキュムレータに項目を累積せずに、単にアキュムレータをpow(y、2)に置き換えました。