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

在Azure Databricks中用前序非空值填充空值的技术实现咨询

在Azure Databricks中填充前一个非空FinalDate值

需求说明:按ID分组、Date排序,将FinalDate字段中首个非空值之后的NULL,填充为最近的前一个非空FinalDate值。


SQL实现

在Databricks SQL中,使用LAST_VALUE窗口函数结合IGNORE NULLS参数即可实现,逻辑简单直接。

示例代码

假设你的源表名为your_table,执行以下查询:

SELECT
  ID,
  Date,
  LAST_VALUE(FinalDate IGNORE NULLS) OVER (
    PARTITION BY ID
    ORDER BY Date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS FinalDate
FROM your_table
ORDER BY ID, Date;

关键逻辑

  • PARTITION BY ID:按ID分组处理不同用户的数据
  • ORDER BY Date:确保按时间顺序取历史非空值
  • LAST_VALUE(FinalDate IGNORE NULLS):自动忽略NULL,提取窗口内最后一个非空的FinalDate
  • ROWS BETWEEN ...:限定窗口范围为当前行及之前的所有行,避免取到后续未发生的数值

PySpark(Python)实现

如果你用Python编写PySpark脚本,可通过窗口函数+last函数实现相同效果。

示例代码

from pyspark.sql.window import Window
from pyspark.sql.functions import last

# 读取源表(如果数据来自现有表,替换为spark.table("your_table"))
data = [
    (1, "20120101", None),
    (1, "20120201", "20120201"),
    (1, "20120301", None),
    (1, "20120401", "20120401"),
    (1, "20120501", None),
    (1, "20120601", None)
]
df = spark.createDataFrame(data, ["ID", "Date", "FinalDate"])

# 定义窗口规则:按ID分区、Date排序
window_spec = Window.partitionBy("ID").orderBy("Date").rowsBetween(Window.unboundedPreceding, Window.currentRow)

# 填充NULL值
filled_df = df.withColumn(
    "FinalDate",
    last("FinalDate", ignoreNulls=True).over(window_spec)
)

# 查看结果
filled_df.orderBy("ID", "Date").show()

关键逻辑

  • Window.partitionBy("ID").orderBy("Date"):保证同ID内按时间顺序处理
  • last("FinalDate", ignoreNulls=True):跳过NULL值,取最近的前一个非空值
  • rowsBetween(...):锁定窗口范围为历史数据,避免提前使用未来的FinalDate值

内容的提问来源于stack exchange,提问作者John Bryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:34:58