Spark RDD [(String,String)]到RDD [Map [String,String]]

时间:2015-07-13 06:20:20

标签: scala apache-spark

有没有办法将所有RDD[(String, String)]收集到一个RDD[Map[String, String]]

,例如,文件input.csv

1,one
2,two
3,three

代码:

val file = sc.textFile("input.csv")
val pairs = file.map(line => { val a = line.split(","); (a(0), a(1)) })
val rddMap = ???

输出(近似值):

val map = rddMap.collect
map: Array[scala.collection.immutable.Map[String,String]] = Array(Map(1 -> one, 2 -> two, 3 -> three))

尝试pairs.collectAsMap,但不会在Map内返回RDD

3 个答案:

答案 0 :(得分:1)

我实际上并不同意你要做的事情。因为如果你这样做,你的地图将分布在集群上,但它不会是一张地图!

您可以使用键值对RDD并使用lookup方法查找给定键的值!

def lookup(key: K): Seq[V]  // Return the list of values in the RDD for key key.

这是一个关于它的用法的例子:

val a = sc.parallelize(List("dog", "tiger", "lion", "cat", "panther", "eagle"), 2)
val b = a.map(x => (x.length, x))  
b.lookup(5) 
res0: Seq[String] = WrappedArray(tiger, eagle)

有关pair RDDs的详情,建议您阅读Chapter 4. Working with Key/Value Pairs - Learning Spark

答案 1 :(得分:0)

如果您只想在执行diriver程序时保留地图,可以将其收集到本地地图(在驱动程序中),以便下一个任务可以在更近的地方使用(您可以在函数传递给下一个任务)。如果你不想多次传送它,你可以播放它。

另一方面,如果您想在不同的驱动程序中使用它,您可以将其序列化并保存在hdfs(或您使用的任何其他存储系统)上。在这种情况下,即使您有RDD,也无法在驱动程序之间保留它而不将其保存到文件系统。

答案 2 :(得分:0)

你会在RDD[Map[String, String]]中获得多少张地图?只有一个,对吗? RDD分发其内容,因为它是分布式集合,但如果它只包含一个元素,则分发该集合变得非常困难,不是吗?

我建议您在PairRDD String中需要基于哈希的查找。值得庆幸的是,您已经在API中使用了lookup函数。

查看code for lookup,它确实使用hashing来获取您的密钥,方式与Map类似。在PairRDD中正确构建键和值就足以达到您的目的,即使构建它们很复杂。

相关问题