我尝试将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"
答案 0 :(得分:1)
你在使用Spark吗?带有“Rdd”后缀的变量意味着。
如果是,请仔细阅读Spark文档的"Shared Variables"部分:
通常,当在远程集群节点上执行传递给Spark操作(例如map或reduce)的函数时,它将在函数中使用的所有变量的单独副本上工作。这些变量将复制到每台计算机,并且远程计算机上的变量的更新不会传播回驱动程序。支持跨任务的通用,读写共享变量效率低下。
当您尝试从map
修改共享变量时,每个工作程序都会修改它自己的版本,并且最终会丢失更新。如果您确实需要共享可变状态,请考虑使用Accumulator
代替。
答案 1 :(得分:0)
不是使用var
,mutable.Map
而是将事物变为副作用(Scala中的三个大字),为什么不直接做事呢?它更清楚发生了什么,也应该解决你的问题:
val activityName:Map[String, String] = rawdf3.map { row =>
row.getAs( "key").toString -> row.getAs( "value").toString
}.toMap