对于 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 替换函数不起作用

Spark DataFrame to Dict - 字典更新序列元素错误

Spark RDD Action 简单用例

在 flatMapToPair 中访问 HashMap

Spark API 之 combineByKey

通过Spark Rest 服务监控Spark任务执行情况