Azure Databricks SQL三表Join查询卡在9300万行无进展求助
Azure Databricks SQL三表Join查询卡在9300万行无进展的排查方案
问题详情
在Azure Databricks SQL中执行三表Join查询时,执行进度停留在9300万行,无后续进展。执行的SQL代码如下:
Select r.med, m.mbs, r.sname, r.apl, m.han, p.pt from ‘hive_metastore.pdw’ p join ‘hive_metastore.rdm’ r on p.pt = r.med join ‘hive.metastore.mdw’ m on r.med = m.han Order By m.han desc
执行状态截图:
排查与解决建议
- 修正SQL语法错误:代码中表名使用了中文单引号
‘’,需替换为英文反引号`;另外hive.metastore.mdw存在拼写错误,应该是hive_metastore.mdw(下划线替代点),语法错误可能导致执行异常。 - 移除排序先验证:
ORDER BY m.han DESC会触发全局Shuffle排序,在9300万级数据量下会极大消耗资源,先去掉排序语句,确认查询是否能正常完成,判断是排序环节还是Join环节导致的停滞。 - 更新表统计信息:Databricks的查询优化器依赖表的统计信息生成最优执行计划,执行以下命令更新Join键的统计信息:
ANALYZE TABLE hive_metastore.pdw COMPUTE STATISTICS FOR COLUMNS pt; ANALYZE TABLE hive_metastore.rdm COMPUTE STATISTICS FOR COLUMNS med; ANALYZE TABLE hive_metastore.mdw COMPUTE STATISTICS FOR COLUMNS han; - 排查数据倾斜:查看Databricks的执行计划,检查是否存在某个Task处理的数据量远高于其他任务。如果Join键存在大量重复值(比如NULL或高频值),会导致数据倾斜,可通过以下方式解决:
- 过滤掉Join键为NULL的异常数据;
- 对高频Join键添加随机后缀(加盐),拆分Join任务后再合并结果。
- 调整集群资源配置:如果集群Executor数量不足、内存或CPU资源不够,会导致查询无法推进。适当增加Executor数量,或升级实例规格,提升集群的计算能力。
内容的提问来源于stack exchange,提问作者Derazu_20
相关产品推荐
相关产品推荐

