我是 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列表中。
答案 0 :(得分:7)
你对该计划的推理方式是错误的。 foreach
在每个执行程序上独立执行,并修改自己的sum
副本。这里没有全局共享状态。只需直接计算值:
df.select("column1").distinct.count
如果你真的想手动处理,你需要某种类型的reduce
:
df.select("column1").distinct.rdd.map(_ => 1L).reduce(_ + _)
答案 1 :(得分:2)
阅读编程指南,它有一节专门介绍:Understanding Closures。如果您确实需要收集某些状态,则可以使用累加器(但请注意,您无法从执行程序节点访问该值,只能对其进行修改)。但是首先尝试不使用它们:根据可用的转换而不是改变状态来思考。