变量未更新

时间:2017-03-21 20:36:30

标签: scala apache-spark

这可能是非常基本的但我肯定在这里遗漏了一些东西。 这都在一个方法中,我在子/子范围内增加/改变一个变量(它可能在if块内,或者像map中的map

但是,结果是变量不变。例如在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 之后,总和保持为零。然而,它应该达到3L。

我错过了什么?

var cnt : Int = 0
    rdd.foreach(article => {
      if (<something>) {
        println(<something>) // being printed
        cnt += 1
        println("counter is now "+cnt) // printed correctly
      }
    })

- 更新 我有类似的行为,其中循环不更新循环外的变量。寻找变量范围的文本,但尚未找到黄金来源。所有的帮助表示赞赏。

public class RecipeListener implements ActionListener{
//rest code  

1 个答案:

答案 0 :(得分:2)

你应该这样做:

val sum = resultsMap.values.reduce(_+_)

您只需获取values,然后使用reduce添加它们。

修改

sum保持不变的原因是mapValues生成视图,这意味着(除其他外)新的地图将不会被计算,除非结果视图是采取行动,所以在这种情况下 - 代码块更新总和只是从未执行

要看到这一点 - 你可以“强制”视图“实现”(计算新地图),并按预期看到总和更新:

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

请参阅此处的相关讨论:Scala: Why mapValues produces a view and is there any stable alternatives?