我有一个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]
' ?
由于
答案 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方法。