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

PySpark中Lag函数未显示全部数据及上年数据关联需求

问题排查与解决方案

先看你代码里的两个核心问题:

  1. 列名拼写错误:窗口函数里的orderBy("years")写错了,你的数据表列名是year(单数),不是years(复数),这直接导致窗口分区后的排序逻辑完全混乱,才会出现只有特定行显示数据的问题。
  2. 缺失值未处理:lag()函数在没有上一年数据时会返回null,但你需要把这些空值替换成0,和示例的展示要求匹配。

修正后的代码

from pyspark.sql import functions as F
from pyspark.sql.window import Window

lag_years = 1

# 修正列名,按period分区、year升序排序,确保同一周期内按年份顺序取数
lag_window_spec = Window.partitionBy("period").orderBy("year")

fact_data_columns = ["sales_unit", "sales_value"]
lagged_columns = []
for col_name in fact_data_columns:
    lagged_col_name = f"{col_name}_prev_year"
    # 用coalesce将lag返回的空值替换为0
    lagged_col = F.coalesce(F.lag(F.col(col_name), lag_years).over(lag_window_spec), F.lit(0)).alias(lagged_col_name)
    lagged_columns.append(lagged_col)

result = fact_data_df.select("*", *lagged_columns)
result.show()

关键说明

  • 修正列名后,窗口内会按period分组,每组内按year升序排列,lag(1)就能精准拿到同一周期下上一年的对应数据。
  • coalesce()函数会优先取lag()的结果,没有数据时就用0填充,和你给出的示例输出完全一致。

内容的提问来源于stack exchange,提问作者Tomás Jullier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:46:13