如何使用Scala / Spark保存/读取Map

时间:2017-01-27 12:12:19

标签: scala apache-spark

我最近想知道如何将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]

1 个答案:

答案 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)]]