有没有办法将所有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中。
发布于 2015-07-13 16:22:44
我实际上并不同意你想要做的事情。因为如果你这样做,你的地图将分布在集群上,但它不会是一个地图!
您可以使用键值对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。
发布于 2015-07-13 15:05:49
如果你只想在你的驱动程序执行时保留你的地图,你可以将它收集到本地地图(在驱动程序中),用于下一个任务,它将在closer中可用(你可以只在传递给下一个任务的函数中使用它)。如果你不想传输很多次,你可以广播它。
另一方面,如果您想在不同的驱动程序中使用它,您可以将其序列化并保存在hdfs (或您使用的任何其他存储系统)上。在这种情况下,即使您有RDD,也无法在不保存到文件系统的情况下在驱动程序之间保留它。
发布于 2015-07-13 20:01:33
在一个RDD[Map[String, String]]中,你会得到多少张地图?只有一个,对吧?RDD分发其内容,因为它是一个分布式集合,但是如果它只包含一个元素,那么分发该集合就会变得相当困难,不是吗?
我建议您在String的PairRDD中使用基于散列的查找。谢天谢地,您已经通过lookup函数在API中实现了这一点。
看看code for lookup,它确实使用了hashing来获取您的密钥,这与Map类似。在PairRDD中正确构建键和值就足够了,即使构建它们很复杂。
https://stackoverflow.com/questions/31376574
复制相似问题