如何在Spark DataFrame数组类型列中将空字符串替换为Null
解决Spark DataFrame数组列空字符串替换为Null的问题
核心思路
针对普通列和数组列分别做差异化处理:
- 普通列:沿用你已实现的
when逻辑,将空字符串替换为Null - 数组列:用Spark的
transform函数遍历数组每个元素,替换空字符串为Null,全程保留元素位置(array_remove会删除元素,不符合需求)
完整实现代码
from pyspark.sql import functions as F from pyspark.sql.types import ArrayType # 定义单列处理逻辑 def process_column(col_name): col_type = df.schema[col_name].dataType # 数组列:遍历每个元素替换空字符串为Null if isinstance(col_type, ArrayType): return F.transform( F.col(col_name), lambda x: F.when(x == "", None).otherwise(x) ).alias(col_name) # 非数组列:沿用原有空字符串替换逻辑 else: return F.when(F.col(col_name) == "", None).otherwise(F.col(col_name)).alias(col_name) # 应用处理逻辑到所有列 processed_df = df.select([process_column(c) for c in df.columns]) processed_df.show(truncate=False)
代码说明
transform函数:Spark 2.4及以上版本支持,专门用于对数组的每个元素执行自定义转换,这里用匿名函数判断元素是否为空字符串,是则替换为None(对应Spark的Null),否则保留原元素- 类型判断:通过
df.schema[col_name].dataType识别列类型,实现不同列的差异化处理 - 位置保留:
transform不会改变数组长度和元素顺序,完全满足需求
执行结果
处理后的DataFrame输出符合预期:
| a | b | c | d |
|---|---|---|---|
| test1 | 7 | [null, hi, null] | [null, null, 0] |
| null | 14 | [null, null, 6, null] | [98, 0, null, 9] |
内容的提问来源于stack exchange,提问作者dataengineeringhelp
相关产品推荐
相关产品推荐

