Scala返回值在foreach中计算

时间:2016-02-29 18:45:32

标签: scala apache-spark

我是 scala和spark 的新手,并尝试了解这里的一些基本内容。

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列表中。

2 个答案:

答案 0 :(得分:7)

你对该计划的推理方式是错误的。 foreach在每个执行程序上独立执行,并修改自己的sum副本。这里没有全局共享状态。只需直接计算值:

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

如果你真的想手动处理,你需要某种类型的reduce

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

答案 1 :(得分:2)

阅读编程指南,它有一节专门介绍:Understanding Closures。如果您确实需要收集某些状态,则可以使用累加器(但请注意,您无法从执行程序节点访问该值,只能对其进行修改)。但是首先尝试不使用它们:根据可用的转换而不是改变状态来思考。