You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:22:51