2016-02-29 98 views
-4

我是新的斯卡拉和火花並試圖瞭解這裏幾個基本的東西。斯卡拉返回值計算在foreach

使用Spark版本1.5。

爲什麼sum的值在以下foreach循環中沒有得到更新。

var sum=1; 
df.select("column1").distinct().foreach(row=>{ 
sum = sum +1 
}) 
println("SUM = "sum) 

- >SUM = 1

我想了解什麼變量的範圍稱爲中的for-each。如果我需要在內部進行一些數學運算並在for循環外獲得結果,該怎麼辦?

上面的理解我的用例是在循環中獲取唯一值並將其附加到String列表中。

+1

你應該提到你不僅在標籤中使用Spark,因爲它很重要。這對於Scala系列非常適用。 –

回答

7

你對程序的推理方式是錯誤的。 foreach在每個執行器上獨立執行並修改自己的sum副本。這裏沒有全球共享狀態。只需直接計值:

df.select("column1").distinct.count 

如果你真的想解決這個手動你需要某種類型的reduce

df.select("column1").distinct.rdd.map(_ => 1L).reduce(_ + _) 
+0

thaks @ zero323在這種情況下,我如何在迭代中存儲值。我想在列中獲取不同的值作爲字符串列表 – user3293666

+0

'distinct.collect.toList' – zero323

2

閱讀編程指南,它有專門爲這個節:Understanding Closures 。如果實際需要收集某些狀態,則可以使用累加器(但請注意,不能從執行程序節點訪問該值,只能修改它)。但是先嚐試沒有他們的想法:用可用的轉換來思考,而不是改變狀態。