我有以下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
我真的很抱歉这个误会。
答案 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
时,您将看不到foreach
(map
是懒惰的)。此外,println
会转到群集的工作节点的标准输出,只有在spark中使用local
模式时才能看到它们。