PySpark DataFrame移除Struct列中Null值键并保留Struct类型
在PySpark DataFrame中移除Struct列的Null值字段并保留Struct类型
要解决这个问题,你可以通过Struct → Map → 过滤Null → 转回Struct的流程实现,既能移除值为Null的键,又能保留原有的Struct类型,避免转成JSON字符串。
具体实现代码
假设你的Struct列名为new_col,代码如下:
from pyspark.sql import functions as F # 1. 将Struct列转换为键值对Map df_with_map = df_cleaned.withColumn("struct_map", F.to_map(F.col("new_col"))) # 2. 过滤Map中值为Null的条目 filtered_map = F.expr("map_filter(struct_map, (k, v) -> v is not null)") # 3. 将过滤后的Map转回Struct类型(复用原Struct的Schema) original_struct_schema = df_cleaned.schema["new_col"].dataType df_result = df_with_map.withColumn("cleaned_struct", F.from_json(F.to_json(filtered_map), original_struct_schema)) # 清理中间生成的map列(可选) df_result = df_result.drop("struct_map")
代码说明
to_map(F.col("new_col")):把Struct类型列转换成键为字段名、值为对应字段值的Map类型。map_filter(...):通过Lambda表达式筛选出Map中值不为Null的键值对,直接移除值为Null的条目。from_json(F.to_json(filtered_map), original_struct_schema):先把过滤后的Map转成JSON字符串,再利用原Struct的Schema把JSON转回Struct类型,确保输出类型和原列一致。
效果验证
输入Struct值:
{"quantity_unit":"Sqm","u_quantity":"6", "capacity":null}
处理后cleaned_struct列的输出(仍为Struct类型):
{"quantity_unit":"Sqm","u_quantity":"6"}
内容的提问来源于stack exchange,提问作者mpr
相关产品推荐
相关产品推荐

