2016-02-29 80 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 。如果实际需要收集某些状态,则可以使用累加器(但请注意,不能从执行程序节点访问该值,只能修改它)。但是先尝试没有他们的想法:用可用的转换来思考,而不是改变状态。