首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark RDD[(String,String)] into RDD[Map[String,String]]

Spark RDD[(String,String)] into RDD[Map[String,String]]
EN

Stack Overflow用户
提问于 2015-07-13 14:20:20
回答 3查看 3.3K关注 0票数 0

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

例如,对于文件input.csv

代码语言:javascript
复制
1,one
2,two
3,three

代码:

代码语言:javascript
复制
val file = sc.textFile("input.csv")
val pairs = file.map(line => { val a = line.split(","); (a(0), a(1)) })
val rddMap = ???

输出(近似值):

代码语言:javascript
复制
val map = rddMap.collect
map: Array[scala.collection.immutable.Map[String,String]] = Array(Map(1 -> one, 2 -> two, 3 -> three))

尝试了pairs.collectAsMap,但它返回Map,而不是在RDD中。

EN

回答 3

Stack Overflow用户

发布于 2015-07-13 16:22:44

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

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

代码语言:javascript
复制
def lookup(key: K): Seq[V]  // Return the list of values in the RDD for key key.

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-07-13 15:05:49

如果你只想在你的驱动程序执行时保留你的地图,你可以将它收集到本地地图(在驱动程序中),用于下一个任务,它将在closer中可用(你可以只在传递给下一个任务的函数中使用它)。如果你不想传输很多次,你可以广播它。

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

票数 0
EN

Stack Overflow用户

发布于 2015-07-13 20:01:33

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

我建议您在StringPairRDD中使用基于散列的查找。谢天谢地,您已经通过lookup函数在API中实现了这一点。

看看code for lookup,它确实使用了hashing来获取您的密钥,这与Map类似。在PairRDD中正确构建键和值就足够了,即使构建它们很复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31376574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档