我最近想知道如何将HashMap
保存到文件中,然后再将其读回。用户Carrie发布了类似的question,但接受的最高答案可能不正确。由于我没有足够的声誉来评论这个答案,我正在解释一种方法,以防有人有同样的问题。
我有一个自定义散列函数的查找映射,其中整数映射到(hash: Int, value: String)
元组的集合。
val lookupMap: Map[Int, Set[(Int, String)]] = ... // filling this map is a different story
我想将此Map保存到文件中,然后将其作为地图读取。此answer建议使用sc.textFile("...").collectAsMap
,但这不起作用,因为textFile
会返回RDD[String]
。
答案 0 :(得分:1)
拍摄地图并将其转换为Seq。然后使用sc.parallelize
形成RDD,您将其保存为sc.saveAsObjectFile
的目标文件。
val savePath = "lookup_map"
val lookupMap: Map[Int, mutable.Set[(Int, String)]] = ... // fill your map
sc.parallelize(lookupMap.toSeq).saveAsObjectFile(savePath)
要阅读地图,您必须知道它的数据类型。在这种情况下,Map[Int, mutable.Set[(Int, String)]]
已转换为Seq
,只会使其成为(Int, Set[(Int, String)])
。然后,您可以使用sc.objectFile[Type](path)
来阅读该文件,并将其作为带有collectAsMap
的地图收集。
type LookupMapSeq = (Int, Set[(Int, String)])
val path = "lookup_map/part-[0-9]*"
val lookupMap = sc.objectFile[LookupMapSeq](path).collectAsMap()
正如所料,结果数据类型为Map[Int, Set[(Int, String)]]
。