Spark 2.1.1版本下PySpark replace()无法将整数0替换为NULL值问题
Spark DataFrame全表0值替换为NULL解决方案
注意:本内容适配Spark版本为2.1.1.2.6.1.0-129
报错原因
你使用my_df.na.replace(0, None)触发报错,是因为Spark 2.1版本的na.replace接口不支持直接传入None作为替换值,接口限制替换值必须为浮点型、整型、长整型、字符串、列表或元组类型。
实现代码(无需指定列名)
首先导入依赖的函数:
from pyspark.sql.functions import when, col
然后执行替换逻辑:
# 自动识别所有数值类型列,避免对字符串、日期等非数值列误处理 numeric_cols = [field.name for field in my_df.schema.fields if str(field.dataType) in ["IntegerType", "LongType", "FloatType", "DoubleType", "ShortType", "ByteType"]] # 遍历所有列完成替换 my_df = my_df.select(*[ when(col(col_name) == 0, None).otherwise(col(col_name)).alias(col_name) if col_name in numeric_cols else col(col_name) for col_name in my_df.columns ])
逻辑说明
- 自动筛选表中所有数值类型列进行替换操作,不会改动非数值列的原有数据
- 不需要手动指定任何列名,适配任意结构的DataFrame
- 完全兼容Spark 2.1.1版本的接口规则,不会触发类型报错
内容的提问来源于stack exchange,提问作者Zaki Siyaji
相关产品推荐
相关产品推荐

