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

PySpark中fillna对ArrayType列无效,如何处理该类列的空值?

问题根因

Spark 3.x版本中,fillna/na.fill仅支持对基础数据类型(数值型、字符串型、布尔型)的空值做替换,不支持ArrayType、MapType、StructType等复杂类型列的空值处理,所以你传入字符串类型的填充值时,只会匹配处理StringType的gender列,ArrayType的arr列会被直接忽略。
至于na.drop未生效的原因是:na.drop默认规则是仅删除所有列全为空的行,如果行内存在任意非空列(比如示例中Jen行的name列有值),即使arr列为空也不会被删除,需要指定要校验空值的列子集才会生效。

解决方案

1. 填充arr列的空值

使用coalesce函数搭配数组字面量实现空值替换,示例如下:

from pyspark.sql.functions import coalesce, array, lit

# 填充规则:gender空值替换为空字符串,arr空值替换为空数组
df = df.fillna("", subset=["gender"]) \
       .withColumn("arr", coalesce("arr", array()))

# 如果需要把arr空值替换为指定默认值的数组,比如[0],写法如下:
# df = df.withColumn("arr", coalesce("arr", array(lit(0))))

2. 删除arr列空值的行

调用na.drop时指定subset参数为要校验的列,示例如下:

# 仅删除arr列为空的行
df = df.na.drop(subset=["arr"])

# 如果要删除gender或arr任意列为空的行,传入多列即可
# df = df.na.drop(subset=["gender", "arr"])

内容的提问来源于stack exchange,提问作者Hafiz Muhammad Shafiq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:54:03