首页 > 解决方案 > Spark 中的 coalesce + orderBy 是可交换的吗?

问题描述

我想运行以下代码:

df = df.coalesce(1).orderBy(["my_col"])

但它的执行显然会成为完成所有排序工作的单个任务的瓶颈。

我知道可以运行以下命令:

df = df.orderBy(["my_col"]).coalesce(1)

但是我不确定 Spark 是否会在分区折叠后保持排序。可以?

如果这样的话,第二个代码将是首选,因为排序将在分布式执行后合并结果,但我担心它可能无法正确保存。

如果它保留,这将意味着两者是可交换的!

标签: apache-sparkpysparkpalantir-foundrycommutativity

解决方案


通过使用很容易知道 Spark 会做什么explain

> df = spark.range(1,100)
> df.coalesce(1).orderBy('id').explain()
== Physical Plan ==
*(2) Sort [id#0L ASC NULLS FIRST], true, 0
+- Coalesce 1
   +- *(1) Range (1, 100, step=1, splits=4)

所以答案是,它们不是可交换的。


推荐阅读