Azure Databricks带DISTINCT和别名的SQL查询ORDER BY原列名报错如何解决
问题根本原因
你遇到的是Spark SQL(Azure Databricks底层SQL引擎)默认解析逻辑和传统SQL方言的差异:
- 不带
DISTINCT时,Spark优化器会将ORDER BY的字段判断下推到投影步骤之前执行,此时原始表字段album.ArtistId还存在,所以可以正常执行。 - 带
DISTINCT时,Spark默认执行顺序是:先做投影(把ArtistId重命名为my_alias,丢弃原始字段名)→ 再执行去重→ 最后处理ORDER BY,去重后的输出只有别名my_alias,所以排序时找不到原始字段名触发报错,和你贴出的执行计划表现完全一致。
无需修改SQL的配置解决方案
目前Azure Databricks运行时10.x及以上版本,都提供了兼容传统SQL行为的配置参数,不需要修改原有SQL语句,只需要调整Spark配置即可:
- 会话级临时生效(仅当前Notebook/会话生效):
直接在SQL查询前执行以下语句即可:SET spark.sql.analyzer.resolveOrderByUsingOriginalPlan = true; - 全局永久生效(集群所有任务都生效):
集群配置页的「Spark 配置」中添加如下键值对,重启集群后生效:spark.sql.analyzer.resolveOrderByUsingOriginalPlan true
如果是使用7.x及以下的旧版Databricks运行时,可替换为以下legacy参数:
spark.sql.legacy.allowSortOnOriginalColumnForDistinctQuery true
开启该配置后,SQL解析器会在处理带DISTINCT的ORDER BY子句时,回溯原始执行计划的字段映射关系,自动将album.ArtistId和别名my_alias关联,无需修改原有SQL即可正常执行。
内容的提问来源于stack exchange,提问作者kotofos
相关产品推荐
相关产品推荐

