PySpark2.4写入JSON时如何将null结构体转为{}、空字段转为空字符串
PySpark 2.4 导出JSON时struct类型null值处理方案
问题原因
原生fillna("")方法仅支持处理顶级简单类型的null值,不会递归处理struct内部字段,也无法对null的struct列做默认值替换,因此无法满足需求。
解决方案
1. 通用自动处理方案(适配任意数量struct列)
无需手动指定struct子字段,自动遍历所有struct列做处理,完全兼容PySpark 2.4版本,代码如下:
from pyspark.sql.functions import col, coalesce, lit, when, struct # 定义struct列通用处理函数 def process_struct_col(col_name, struct_fields): # 把struct内部的null字段替换为"" internal_fields = [ coalesce(col(f"{col_name}.{field.name}"), lit("")).alias(field.name) for field in struct_fields ] # 整个struct为null时返回空struct(JSON输出为{}) return when( col(col_name).isNull(), struct() ).otherwise( struct(*internal_fields) ).alias(col_name) # 遍历所有列自动处理 processed_cols = [] for field in df.schema.fields: if field.dataType.typeName() == "struct": processed_cols.append(process_struct_col(field.name, field.dataType.fields)) else: # 非struct列按需配置null替换规则,这里统一替换为"" processed_cols.append(coalesce(col(field.name), lit("")).alias(field.name)) # 生成处理后的DataFrame processed_df = df.select(*processed_cols) # 导出JSON processed_df.coalesce(1).write.mode("overwrite").format('json').save('/home/test')
2. 手动指定列处理方案(适合固定schema场景)
如果schema固定不需要通用适配,也可以手动编写每个struct列的处理逻辑:
from pyspark.sql.functions import col, coalesce, lit, when, struct processed_df = df.select( col("id"), # 处理child1列 when( col("child1").isNull(), struct() ).otherwise( struct( coalesce(col("child1.f_name"), lit("")).alias("f_name"), coalesce(col("child1.l_name"), lit("")).alias("l_name") ) ).alias("child1"), # 处理child2列 when( col("child2").isNull(), struct() ).otherwise( struct( coalesce(col("child2.f_name"), lit("")).alias("f_name"), coalesce(col("child2.l_name"), lit("")).alias("l_name") ) ).alias("child2") ) # 导出逻辑同上 processed_df.coalesce(1).write.mode("overwrite").format('json').save('/home/test')
输出验证
处理后导出的JSON完全匹配预期:
{"id":"123","child1":{"f_name":"John","l_name":"Matt"},"child2":{"f_name":"Paul","l_name":"Matt"}} {"id":"111","child1":{"f_name":"Jack","l_name":""},"child2":{}} {"id":"101","child1":{},"child2":{}}
内容的提问来源于stack exchange,提问作者Lijju Mathew
相关产品推荐
相关产品推荐

