Scala - 无法访问for循环中的变量

时间:2017-09-04 15:54:19

标签: scala apache-spark

我有以下RDD:

1:AAAAABAAAAABAAAAABAAAAAB
2:BBAAAAAAAAAABBAAAAAAAAAA

每个角色都是一个事件。 Mi期望的输出是获得每组事件的出现次数。对于第一个示例,输出应为:

{ "A" -> 6 , "B" -> 6 }

使用我的代码,我得到了所需的输出:

val rdd = sqlContext.sparkContext.makeRDD(Seq(
"1:AAAAABAAAAABAAAAABAAAAAB","2:BBAAAAAAAAAABBAAAAAAAAAA"))
val rddSplited = rdd.map(_.split(":")(1).toList)
    val values = scala.collection.mutable.Map[String, Long]()
    var iteracion = 0
    for (ocurrences <- rddSplited) {
      var previousVal = "0"
      for (listValues <- ocurrences) {
        if (listValues.toString != previousVal) {
          values.get(listValues.toString) match {
            case Some(e) => values.update(listValues.toString, e + 1)
            case None => values.put(listValues.toString, 1)
          }
          previousVal = listValues.toString()
        }
      }
      //println(values)  //return the values

    }
      println(values)  //returns an empty Map

  }

问题在于

  

的println(值)

不会返回任何数据,但如果在放置注释的println时更改它,则Map值会返回值。

如何在主for循环后返回地图的最终值?

很抱歉,如果我的实施不是最好的,我是Scala / Spark世界的新手。

提前致谢。

我正在编辑问题以更好地解释我想要实现的目标, 答案中提供的代码(感谢您的所有帮助)不会返回所需的输出。我没有尝试计算事件的数量,我需要的是计算事件发生变化时发生的次数,即:

    AAAAABAAAAABAAAAABAAAAAB  =>  A-> 4 , B-> 4
    BBAAAAAAAAAABBAAAAAAAAAA  =>  A-> 2 , B-> 2

So the final output should be  A-> 6 , B-> 6

我真的很抱歉这个误会。

2 个答案:

答案 0 :(得分:2)

好像你正试图以类似Java的方式实现你的结果。我编写了一个Scala功能样式程序,它完全符合您的要求,如下所示:

x <- "<TEXT>Purchased this as a cert pre owned for a great price. \nHad only 10000 miles on it and jumped on it.</TEXT>"
gsub("(<TEXT>.*?)\\h*\\R+\\h*(.*?</TEXT>)", "\\1\\2", x, perl=TRUE)
## => [1] "<TEXT>Purchased this as a cert pre owned for a great price.Had only 10000 miles on it and jumped on it.</TEXT>"

答案 1 :(得分:0)

您的代码存在多个问题(相互状态,延迟转换),请尝试以下方法:

val rdd = ss.sparkContext.makeRDD(Seq("1:AAAAABAAAAABAAAAABAAAAAB","2:BBAAAAAAAAAABBAAAAAAAAAA"))

rdd.foreach{record =>
    val Array(_,events) = record.split(":")
    val eventCount = events.groupBy(identity).mapValues(_.size)
    println(eventCount)
  }

请注意,当您使用println代替map时,您将看不到foreachmap是懒惰的)。此外,println会转到群集的工作节点的标准输出,只有在spark中使用local模式时才能看到它们。