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

PySpark如何将列中null值替换为同列上方最近非空值

PySpark实现国家列向前非空填充方案

该需求属于典型的**向前空值填充(Forward Fill)**场景,即保留列中已有的非空值,将空值替换为同列上方最近的非空值,全程使用Spark原生函数实现,无自定义UDF性能损耗。

核心注意前提

Spark是分布式计算引擎,数据读取后无默认行顺序保证,必须先生成和原始CSV行序一致的自增ID作为排序依据,否则会出现行序错乱、填充结果错误的问题。

完整实现代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, last, monotonically_increasing_id
from pyspark.sql.window import Window

# 初始化Spark会话(实际使用时按自身环境配置参数)
spark = SparkSession.builder.appName("country_col_fill").getOrCreate()

# 读取CSV数据源,替换为你的实际文件路径
# df = spark.read.csv("your_file_path.csv", header=True, inferSchema=True)

# 以下为样例数据构造,实际使用时替换为上方的CSV读取代码
sample_data = [
    ("BR", 1995), (None, 1997), (None, 1999), (None, 2001), (None, 2003), (None, 2005),
    ("NO", 1995), (None, 1997), (None, 1999), (None, 2001), (None, 2003), (None, 2005),
    ("RO", 1995), (None, 1997), (None, 1999), (None, 2001), (None, 2003), (None, 2005),
    ("AC", 1995), (None, 1997)
]
df = spark.createDataFrame(sample_data, schema=["C", "Y"])

# 步骤1:生成和原始读取顺序一致的单调自增行ID,作为排序依据
df = df.withColumn("row_seq", monotonically_increasing_id())

# 步骤2:定义填充窗口:按行序升序,窗口范围覆盖从第一行到当前行
fill_window = Window.orderBy("row_seq").rowsBetween(Window.unboundedPreceding, Window.currentRow)

# 步骤3:执行填充,取窗口内最后一个非空的C值覆盖空值,最后删除辅助行ID列
filled_result = df.withColumn(
    "C",
    last(col("C"), ignorenulls=True).over(fill_window)
).drop("row_seq")

# 输出验证结果
filled_result.show()

实现逻辑说明

  • last(col("C"), ignorenulls=True):会忽略窗口范围内的null值,返回窗口中最后一个(即距离当前行最近的上方)非空C列值
  • 窗口范围设置为从分区首行到当前行,保证每次取值都只参考当前行及以上的内容,不会取到下方行的值
  • 如果实际数据需要按维度分组填充(比如不同报表区域、不同数据块独立填充),只需在窗口定义中增加分区规则即可,示例:
    # 按report_group列分组,每组内部独立做向前填充
    fill_window = Window.partitionBy("report_group").orderBy("row_seq").rowsBetween(Window.unboundedPreceding, Window.currentRow)
    

运行结果示例

执行后C列空值会被正确填充,输出格式如下:

+---+----+
|  C|   Y|
+---+----+
| BR|1995|
| BR|1997|
| BR|1999|
| BR|2001|
| BR|2003|
| BR|2005|
| NO|1995|
| NO|1997|
| NO|1999|
| NO|2001|
| NO|2003|
| NO|2005|
| RO|1995|
| RO|1997|
| RO|1999|
| RO|2001|
| RO|2003|
| RO|2005|
| AC|1995|
| AC|1997|
+---+----+

内容的提问来源于stack exchange,提问作者Matheus Goulart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:30:45