Spark DataFrame如何批量对除前两列外所有列向前填充空值
Spark 批量向前填充(ffill)实现方案
步骤1:导入依赖函数
from pyspark.sql.functions import last
步骤2:批量执行列填充逻辑
你已经定义好了符合业务需求的ffill窗口,只需提取除前两列外的所有字段批量应用填充规则即可,无需手动枚举30+列名:
# 提取需要做向前填充的列(自动排除前两列date、group) fill_columns = sdf.columns[2:] # 批量构造查询逻辑:前两列直接保留,后续列全部用ffill逻辑覆盖原有空值 sdf_ffill = sdf.select( # 保留前两列原始值 *sdf.columns[:2], # 遍历所有需要填充的列,应用向前填充规则 *[last(col=c, ignorenulls=True).over(ffill).alias(c) for c in fill_columns] )
效果验证
执行sdf_ffill.orderBy('group','date').show()即可查看填充结果,和单列手动填充效果完全一致:
+--------+-----+-----+------+ | date|group|value|value2| +--------+-----+-----+------+ |2020-1-1| a| null| null| |2020-2-1| a| null| 15| |2020-3-1| a| 20| 15| |2020-1-1| b| 5| 20| |2020-2-1| b| 5| 20| |2020-3-1| b| 10| 20| |2020-4-1| b| 10| 100| +--------+-----+-----+------+
补充说明
- 该逻辑可适配任意数量的后续列,只要前两列是不需要填充的分区、排序字段即可直接复用
last(ignorenulls=True)会自动跳过空值,取窗口范围内最新的非空值,完全匹配向前填充的业务需求
内容的提问来源于stack exchange,提问作者Roger Steinberg
相关产品推荐
相关产品推荐

