当使用coalesce进行连接操作时,Spark的工作原理是什么?

3

假设我有两个DataFrame,分别是df1df2

我会先进行一个join操作,然后再进行一个coalesce操作。

df1.join(df2, Seq("id")).coalesce(1)

看起来Spark创建了2个阶段,第二个阶段中发生SortMergeJoin的计算只由一个任务执行。

因此,这个唯一的任务需要将两个完整的数据集都存储在内存中(参考:http://spark.apache.org/docs/latest/tuning.html#memory-usage-of-reduce-tasks)。

你能确认吗?

(我本来以为排序会使用spark.sql.shuffle.partitions设置,并有第三个额外的阶段执行合并操作。)

参考DAG

enter image description here

1个回答

3
我在书籍《高性能Spark》中找到了确认信息。

由于任务在子分区上执行,因此在包括coalesce操作的阶段中执行的任务数等同于coalesce转换结果RDD中的分区数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接