对于 Spark API,collectAsMap() 函数如何工作
Posted
技术标签:
【中文标题】对于 Spark API,collectAsMap() 函数如何工作【英文标题】:How does the collectAsMap() function work for Spark API 【发布时间】:2016-06-09 19:14:05 【问题描述】:我试图了解当我们在 spark 中运行 collectAsMap
() 函数时会发生什么。根据 Pyspark 文档,它说,
collectAsMap(self) 将此RDD中的键值对作为字典返回给master。
对于核心火花,它说,
def collectAsMap(): Map[K, V] 返回此RDD中的键值对 以 Map 的形式传递给 master。
当我尝试在 pyspark 中为列表运行示例代码时,我得到以下结果:
对于 scala,我得到了这个结果:
我有点困惑为什么它没有返回列表中的所有元素。有人可以帮助我了解在这种情况下发生了什么,以及为什么我会得到选择性结果。
谢谢。
【问题讨论】:
当您收集 RDD 作为地图/字典时,它不能对多个不同的键值对使用相同的键,因此每个连续对都具有相同的key 覆盖它之前的内容。因此,在您的两个示例中,只有最后两对在collectAsMap
中存在。如果您只使用collect
,您会看到所有原始对都保存在数组或列表中
谢谢@oldrinb 这消除了我对collectAsMap的怀疑。 :)
【参考方案1】:
collectAsMap
的语义在 Scala 和 Python API 之间是相同的,所以我将查看第一个 WLOG。 PairRDDFunctions.collectAsMap
的文档明确指出:
警告:这不会返回多映射(因此,如果您对同一个键有多个值,则每个键只保留一个值在返回的映射中)
特别是,当前的实现将键值对按顺序插入到结果映射中,因此在您的两个示例中只有最后两个对存在。
如果您改用collect
,它将返回Array[(Int,Int)]
,而不会丢失任何对。
【讨论】:
【参考方案2】:collectAsMap
将返回配对 RDD
的结果作为 Map 集合。而且由于它正在返回 Map 集合,因此您只会得到具有唯一键的对,而具有重复键的对将被删除。
【讨论】:
以上是关于对于 Spark API,collectAsMap() 函数如何工作的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL Dataframes - 如果使用 RDD.collectAsMap() 创建地图,则从 DataFrameNaFunctions 替换函数不起作用