如何使用Scala/Spark保存/读取地图
如何使用Scala/Spark保存/读取地图
我最近想知道如何将HashMap
保存到文件中,并在以后读取它。用户Carrie发布了一个类似的问题,但是接受的最佳答案可能是不正确的。由于我声望不足以评论该答案,我将解释一种实现方法,以防有人有同样的问题。
问题
我有一个查找映射,其中整数被映射到(hash: Int, value: String)
元组的集合。
val lookupMap: Map[Int, Set[(Int, String)]] = ... // 填充这个映射是另外一个故事
我想将这个映射保存到文件中,然后以映射的形式读取它。这个答案建议使用sc.textFile("...").collectAsMap
,但是这不起作用,因为textFile
返回的是RDD[String]
类型。
如何使用Scala/Spark保存和读取Map
在Scala/Spark中,我们有时候需要将Map保存到文件中,然后再读取出来使用。下面将介绍如何保存和读取Map。
保存到文件
首先,我们需要将Map转换成Seq,然后使用sc.parallelize
将其转换成RDD,并使用sc.saveAsObjectFile
将其保存为对象文件。
val savePath = "lookup_map" val lookupMap: Map[Int, mutable.Set[(Int, String)]] = ... // 填充你的Map sc.parallelize(lookupMap.toSeq).saveAsObjectFile(savePath)
从文件中读取
要读取保存的Map,我们需要知道其数据类型。在这个例子中,Map[Int, mutable.Set[(Int, String)]]
被转换成了Seq
,即(Int, Set[(Int, String)])
。然后我们可以使用sc.objectFile[Type](path)
来读取文件,并使用collectAsMap
将其作为Map收集起来。
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)]]
。