映射值在 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: _* )
我刚开始使用 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: _* )