Scala 变量未更新

Scala 变量未更新,scala,apache-spark,Scala,Apache Spark,这也许是非常基本的,但我肯定遗漏了一些东西。 这一切都在一个方法中,我在子/子范围内递增/更改一个变量(它可以在if块中,或者像这里一样,在映射中) 但是,结果是不变的。e、 g.在这里,映射后的和保持为零。然而,它应该达到3L 我错过了什么 val resultsMap = scala.collection.mutable.Map.empty[String, Long] resultsMap("0001") = 0L resultsMap("0003") = 2L resultsMap("00

这也许是非常基本的,但我肯定遗漏了一些东西。 这一切都在一个方法中,我在子/子范围内递增/更改一个变量(它可以在
if
块中,或者像这里一样,在
映射中)

但是,结果是不变的。e、 g.在这里,
映射后的和保持为零。然而,它应该达到3L

我错过了什么

val resultsMap = scala.collection.mutable.Map.empty[String, Long]
resultsMap("0001") = 0L
resultsMap("0003") = 2L
resultsMap("0007") = 1L
var sum = 0L
resultsMap.mapValues(x => {sum = sum + x})
//  I first wrote this, but then got worried and wrote more explicit version too, same behaviour
// resultMap.mapValues(sum+=_)
println("total of counts for txn ="+sum) // sum still 0
--更新 我有类似的行为,循环不更新循环外的变量。正在查找变量范围的文本,但尚未找到黄金来源。感谢所有的帮助

var cnt : Int = 0
    rdd.foreach(article => {
      if (<something>) {
        println(<something>) // being printed
        cnt += 1
        println("counter is now "+cnt) // printed correctly
      }
    })
var-cnt:Int=0
foreach(article=>{
如果(){
println()//正在打印
cnt+=1
println(“计数器现在为”+cnt)//打印正确
}
})

您应该这样做:

val sum = resultsMap.values.reduce(_+_)
您只需获取您的
,然后将它们与
reduce
相加即可

编辑

sum
保持不变的原因是
mapValues
生成一个视图,这意味着(除其他外)除非对生成的视图进行操作,否则不会计算新的映射,因此在这种情况下-代码块更新sum根本不会执行

要看到这一点,您可以“强制”视图“物化”(计算新映射),并看到sum如预期的那样被更新:

var sum = 0L
resultsMap.mapValues(x => {sum = sum + x}).view.force
println("SUM: " + sum) // prints 3

请参见此处的相关讨论:

您应该这样进行:

val sum = resultsMap.values.reduce(_+_)
您只需获取您的
,然后将它们与
reduce
相加即可

编辑

sum
保持不变的原因是
mapValues
生成一个视图,这意味着(除其他外)除非对生成的视图进行操作,否则不会计算新的映射,因此在这种情况下-代码块更新sum根本不会执行

要看到这一点,您可以“强制”视图“物化”(计算新映射),并看到sum如预期的那样被更新:

var sum = 0L
resultsMap.mapValues(x => {sum = sum + x}).view.force
println("SUM: " + sum) // prints 3

请参阅此处的相关讨论:

请欣赏您关于mapValues的指针,它只提供了一个视图,因此也提供了效果。然而,我也有类似的行为,我相信这与变量范围有关更新了关于mapValues的指针,该指针仅提供一个视图,因此效果良好。然而,我也有类似的行为,我相信这与变量范围有关更新了问题可能重复您有两个不同的问题。第一个(
mapValues
producing a view)已回答。您编辑的一个是因为Spark在许多Worker之间运行循环,每个Worker都获得自己的
cnt
副本,而原始副本不会更新。看(和一堆其他问题)你有两个不同的问题。第一个(
mapValues
producing a view)已回答。您编辑的一个是因为Spark在许多Worker之间运行循环,每个Worker都获得自己的
cnt
副本,而原始副本不会更新。请参阅(以及一系列其他问题)