PySpark中Lag函数未显示全部数据及上年数据关联需求
问题排查与解决方案
先看你代码里的两个核心问题:
- 列名拼写错误:窗口函数里的
orderBy("years")写错了,你的数据表列名是year(单数),不是years(复数),这直接导致窗口分区后的排序逻辑完全混乱,才会出现只有特定行显示数据的问题。 - 缺失值未处理:
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
相关产品推荐
相关产品推荐

