You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:21:05