映射值在 scala 中的每个值外为空

Map value empty outside a for each in scala

我刚开始使用 Scala 编程。我还使用 Apache spark 读取文件 - moviesFile。在下面的代码中,我正在更新 foreach 函数内的可变映射。映射在 foreach 函数中更新。但是一旦 foreach 退出,这些值就不存在了。

如何使地图变量中的值永久保留 movieMap

 val movieMap = scala.collection.mutable.Map[String,String]()
 val movie = moviesFile.map(_.split("::")).foreach { 
    x => x.mkString(" ")
    val movieid = x(0)
    val title = x(1)
    val genre = x(2)
    val value = title+","+genre
    movieMap(movieid.toString()) = value.toString()
    println(movieMap.keySet)
}
println(movieMap.keySet)
println(movieMap.get("29"))

我认为您使用 Spark 的方式非常错误。如果你想使用 Spark,你将不得不使用 Spark 的分布式数据结构。

我建议继续使用 Spark 的分布式和并行数据结构 (RDD's)。包含 ( key, value ) pairs 的 RDD 隐式提供了一些类似 Map 的功能。

Import org.apache.spark.SparkContext._

// Assume sc is the SparkContext instance

val moviesFileRdd = sc.textFile("movies.txt")

// moviesRdd is RDD[ ( String, String ) ] which acts as a Map-like thing of ( key, value ) pairs
val moviesRdd = moviesFileRdd.map( line =>
  val splitLine = line.split( "::" )
  val movieId = splitLine(0)
  val title = splitLine(1)
  val genre = splitLine(2)
  val value = title + ", " + genre
  ( movieId.toString, value.toString )
)

// You see... RDD[ ( String, String ) ] offers some map-like things.
// get a list of all values with key 29
val listOfValuesWithKey29 = moviesRdd.lookup( "29" )

// I don't know why ? but if you really need a map here then
val moviesMap = moviesRdd.collectAsMap

// moviesMap will be a immutable Map, in case you need a mutable Map,
val moviesMutableMap = mutable.Map( moviesMap.toList: _* )