Databricks SQL查询结果反复不一致,求技术排查方案
Databricks SQL查询结果不一致的排查思路
以下SQL在Databricks中每次执行返回的count结果都不同,不符合预期:
select count (*) from (select policy_number, writing_agent_number, agency, agent_part, int(total_parts) total_parts from (select a.policy_number, a.writing_agent_number, a.agency, sum(a.agent_part) over ( partition by a.policy_number) total_parts, a.agent_part from ml_raw.agent_splits_dec_12 a) b where int(total_parts) = 1 order by b.policy_number)
排查思路:
- 核查源表数据稳定性:多次执行
select count(*) from ml_raw.agent_splits_dec_12,确认源表是否有增量写入、更新或删除操作,导致每次查询的基础数据不一致。也可查看表的修改记录、上游任务日志,确认是否有数据变更行为。 - 排查浮点计算精度问题:
sum(a.agent_part)的结果为浮点型,直接转int时可能因浮点精度误差(如实际为0.9999999999或1.0000000001)导致转换结果不稳定。可修改判断逻辑,比如用round(total_parts) = 1,或先将total_parts转为decimal类型(如cast(total_parts as decimal(18,6)) = 1),或者用范围判断total_parts between 0.999999 and 1.000001规避浮点误差。 - 检查分布式执行的随机性:Spark分布式执行时,shuffle过程的随机性可能导致窗口函数的sum计算出现细微差异。可尝试在源表查询后添加
repartition(固定分区数)强制固定分区,或查看两次查询的执行计划(用EXPLAIN),确认是否有执行路径差异。 - 验证表存储格式的一致性:若源表非Delta Lake格式,可能存在未提交的写入文件或文件损坏问题;若是Delta表,可执行
DESCRIBE HISTORY ml_raw.agent_splits_dec_12查看表版本变化,确认是否有版本切换导致数据变更。
内容的提问来源于stack exchange,提问作者shafee ul kabir Fahim
相关产品推荐
相关产品推荐

