Azure Databricks中Spark SQL查询静态数据行数不稳定问题求助
PySpark SQL查询结果行数不稳定问题排查与修复
在Azure Databricks中使用PySpark SQL查询静态数据时,发现每次执行查询返回的行数不一致:第一次返回3389265行,第二次返回3389365行,第三次返回3389284行。排查确认sales_base表数据正常,但最终sales表的行数每次都会变化。
问题根源
问题出在sales CTE中的row_number()窗口函数逻辑:
row_number() over (partition by product_id_2,company,date_format(voucher_date, 'yyyy-MM'),customer_segment,customer_group ORDER BY date_format(voucher_date, 'yyyy-MM') desc) as rn
这里的ORDER BY仅依赖date_format(voucher_date, 'yyyy-MM') desc,当同一个分区(即同一产品、公司、年月、客户分段、客户组)内有多条记录时,这些记录的年月值完全相同,无法唯一确定排序顺序。
Spark作为分布式计算引擎,处理这类排序键重复的场景时,每次执行的分区内记录顺序可能因任务调度、数据分片的细微差异而变化,导致row_number()分配的编号不稳定——不同的记录会被标记为rn=1,最终筛选后的行数自然波动。
修复方案
需要在ORDER BY子句中添加唯一标识字段,确保每个分区内的排序逻辑是确定性的。可以添加精确到时分秒的voucher_date,或者业务上的唯一主键(如订单行ID、记录ID等),让同一个分区内的记录排序结果固定。
修改后的sales CTE代码示例:
sales as ( column from ( column ,row_number() over ( partition by product_id_2,company,date_format(voucher_date, 'yyyy-MM'),customer_segment,customer_group ORDER BY date_format(voucher_date, 'yyyy-MM') desc, voucher_date desc, SDDOCO, SDDCTO ) as rn from sales_base ) as a where rn=1 and quantity <>0 ORDER BY voucher_date )
这里添加了voucher_date desc(精确到秒的日期排序)和订单相关字段SDDOCO, SDDCTO,确保同一分区内的记录排序完全唯一,避免row_number()结果波动。如果业务中有更合适的唯一主键(如行ID),替换成对应字段即可。
内容的提问来源于stack exchange,提问作者Arpan Ghimire
相关产品推荐
相关产品推荐

