pivot后的DataFrame如何通过groupby/merge得到同一ID下的完整关联数据?
PySpark DataFrame 同ID全局字段空值填充方案
你需要的效果可以通过窗口函数直接实现,不需要做二次groupby或者自连接,性能更高也更易维护:
- 定义按ID分区的窗口
from pyspark.sql import Window import pyspark.sql.functions as F # 窗口规则:按ID分组,同一ID的所有行划为同一个窗口 w = Window.partitionBy("ID")
- 对需要全局填充的字段批量填充非空值
因为同一ID下Name、surname、Town这类全局字段只有一个有效值,用max函数会自动忽略空值,直接提取到整个分组的有效值,原有非空单元格的内容不会被修改:
# 手动指定需要填充的全局字段 df_result = df.withColumn("Name", F.max("Name").over(w)) \ .withColumn("surname", F.max("surname").over(w)) \ .withColumn("Town", F.max("Town").over(w))
如果需要填充的全局字段数量较多,可以用批量表达式生成的方式简化代码:
# 把所有需要全局填充的字段放到这个列表里 global_fill_cols = ["Name", "surname", "Town"] # 生成查询表达式:全局字段用窗口填充,其余字段保留原值 select_expr = [ F.max(col).over(w).alias(col) if col in global_fill_cols else col for col in df.columns ] df_result = df.select(*select_expr)
如果你的场景中可能出现同一ID下某个全局字段有多个非空值的情况,也可以把max替换为first(col, ignorenulls=True),效果一致。
内容的提问来源于stack exchange,提问作者Fizor
相关产品推荐
相关产品推荐

