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
相关产品推荐
相关产品推荐

