我正在使用 Spark,在连接两个预排序和分桶表期间遇到意外的排序操作。两个表均使用相同数量的存储桶创建,并按连接键排序。但是,当我执行连接操作时,Spark 的执行计划中仍然包含排序步骤。
这是我的 Spark SQL 查询的简化版本:
SELECT a.*, b.*
FROM tableA a
JOIN tableB b ON a.joinKey = b.joinKey
tableA
和tableB
都按joinKey
进行存储和排序。尽管如此,执行计划仍包含排序操作:
*(1) Sort [joinKey#1 ASC NULLS FIRST], false, 0
...
*(2) Sort [joinKey#2 ASC NULLS FIRST], false, 0
我希望 Spark 通过利用现有的排序顺序来优化连接,而不需要额外的排序步骤。这是特别令人惊讶的,因为没有数据倾斜,并且表格分布良好。
解决了。 Spark.sql.legacy.bucketedTableScan.outputOrdering = true;