PySpark填充Struct结构体列null空值报错及无效问题解决
问题原因
- fillna不生效:PySpark的
fillna仅支持对DataFrame顶层列做空值填充,无法识别Title.Type这类结构体嵌套字段路径,因此你传入的填充规则不会生效。 - expr抛出语法异常的原因有三个:
- expr内部是SQL语法,不能直接使用Python的
if...else写法,你写的isNotNull()也是PySpark Python API的写法,SQL中对应判断非空的语法是IS NOT NULL。 - 你直接把Python变量
default_type写进了SQL字符串,SQL引擎无法识别该Python变量。 - 整个struct构造语句末尾缺少闭合的右括号
)。
- expr内部是SQL语法,不能直接使用Python的
正确实现方案
方案1:coalesce+expr(全版本兼容)
coalesce函数会返回参数中第一个非空的值,刚好适配空值替换需求,代码如下:
default_type = 'type one' # 用f字符串将Python变量传入SQL表达式,字符串类型的默认值需要加引号 df = df.withColumn('Title', expr(f""" struct( Title.TitleID, coalesce(Title.Type, '{default_type}') as Type ) """))
方案2:withField方法(PySpark 3.1及以上版本推荐,写法更简洁)
withField方法可以直接修改结构体中的指定字段,不需要手动重构整个结构体,代码如下:
from pyspark.sql.functions import coalesce, lit default_type = 'type one' df = df.withColumn( 'Title', col('Title').withField('Type', coalesce(col('Title.Type'), lit(default_type))) )
执行后调用df.show(truncate=False)可验证输出结果:
+---+-------------+ |ID |Title | +---+-------------+ |1 |{2, test} | |3 |{4, type one}| +---+-------------+
内容的提问来源于stack exchange,提问作者Connell.O'Donnell
相关产品推荐
相关产品推荐

