有没有办法将所有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
。
答案 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
中正确构建键和值就足以达到您的目的,即使构建它们很复杂。