如何将Scala RDD转换为Map

时间:2014-10-14 01:36:09

标签: scala apache-spark

我有一个RDD(字符串数组)org.apache.spark.rdd.RDD[String] = MappedRDD[18] 并将其转换为具有唯一ID的地图。我做了val vertexMAp = vertices.zipWithUniqueId' 但这给了我另一个'org.apache.spark.rdd.RDD[(String, Long)]'类型的RDD,但我想要一个' Map[String, Long]' 。如何转换我的org.apache.spark.rdd.RDD[(String, Long)] to Map[String, Long]' ?

由于

3 个答案:

答案 0 :(得分:24)

collectAsMap中有一个内置的PairRDDFunctions函数可以为您提供RDD中对值的映射。

val vertexMAp = vertices.zipWithUniqueId.collectAsMap

记住RDD是分布式数据结构非常重要。你可以将它想象成一个“零件”。您的数据分布在群集上。当你collect时,你强迫所有这些部分转到驱动程序并且能够做到这一点,它们需要适合驱动程序的内存。

从评论中看,在您的情况下,您需要处理大型数据集。制作地图不会起作用,因为它不适合驾驶员的记忆;如果你尝试,会导致OOM异常。

您可能需要将数据集保留为RDD。如果要创建Map以查找元素,可以在PairRDD上使用lookup,如下所示:

import org.apache.spark.SparkContext._  // import implicits conversions to support PairRDDFunctions

val vertexMap = vertices.zipWithUniqueId
val vertixYId = vertexMap.lookup("vertexY")

答案 1 :(得分:6)

收集到“本地”机器,然后将Array [(String,Long)]转换为Map

val rdd: RDD[String] = ???

val map: Map[String, Long] = rdd.zipWithUniqueId().collect().toMap

答案 2 :(得分:3)

您无需转换。 PairRDDFunctions 的含义检测到基于二元组的RDD并自动应用PairRDDFunctions方法。