在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,提取窗口内最后一个非空的FinalDateROWS 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
相关产品推荐
相关产品推荐

