Scala地图不存储数据

时间:2016-03-23 02:49:20

标签: scala dictionary

我尝试将csv数据保存到哈希映射。它似乎读取csv文件并在RDD中保存得很好,但没有映射。 我尝试了hashmap,使用put或+ =方法映射但没有任何效果。对此有何想法?

val logFile3 = "d:/data/data.csv"

val rawdf3 = sqlContext.read
  .format("com.databricks.spark.csv")
  .option("header", "true") // Use first line of all files as header
  .option("inferSchema", "true") // Automatically infer data types
  .load(logFile3)

var activityName = scala.collection.mutable.Map[String, String]()

//save key-value to RDD to check
val activityNameRDD = rawdf3.map { row =>
  activityName += (row.getAs( "key").toString -> row.getAs( "value").toString) // I think It's work but not
  println(row.getAs( "key").toString + " - " + row.getAs( "value").toString) // print all data well
  (row.getAs( "key").toString, row.getAs( "value").toString)
}
activityNameRDD.saveAsTextFile( "d:/outdata/activityName") // all csv data saved well

activityName.foreach( {row => println( row._1 + " = " + row._2)}) // print nothing

println( activityName.getOrElse( "KEY1", "NON")) // print "NON"
println( activityName.getOrElse( "KEY2", "NON")) // print "NON"

2 个答案:

答案 0 :(得分:1)

你在使用Spark吗?带有“Rdd”后缀的变量意味着。

如果是,请仔细阅读Spark文档的"Shared Variables"部分:

  

通常,当在远程集群节点上执行传递给Spark操作(例如map或reduce)的函数时,它将在函数中使用的所有变量的单独副本上工作。这些变量将复制到每台计算机,并且远程计算机上的变量的更新不会传播回驱动程序。支持跨任务的通用,读写共享变量效率低下。

当您尝试从map修改共享变量时,每个工作程序都会修改它自己的版本,并且最终会丢失更新。如果您确实需要共享可变状态,请考虑使用Accumulator代替。

答案 1 :(得分:0)

不是使用varmutable.Map而是将事物变为副作用(Scala中的三个大字),为什么不直接做事呢?它更清楚发生了什么,也应该解决你的问题:

val activityName:Map[String, String] = rawdf3.map { row =>
  row.getAs( "key").toString -> row.getAs( "value").toString
}.toMap