Databricks中PySpark如何将DataFrame的'?'字符串转换为NULL
可行实现方案
之前方案失效的核心原因:你操作的是PySpark分布式DataFrame,和numpy、pandas的单机DataFrame API完全不通用,第三套方案的问题是regexp_replace中?是正则特殊字符需要转义、替换目标为字符串'NA'而非PySpark原生NULL、且没有将修改后的新DataFrame赋值给变量保存,所以没有生效。
最优方案:使用PySpark原生na.replace方法
这是最简单的官方原生实现,支持全表或指定列批量替换,性能最优:
# 1. 全表所有列将'?'替换为NULL d = d.na.replace('?', None) # 2. 如果仅需要替换指定列,新增subset参数指定目标列即可 # target_cols = ['workclass', 'occupation', 'native-country'] # d = d.na.replace('?', None, subset=target_cols) # 替换完成后直接调用dropna删除含空值的行 d = d.dropna(subset=target_cols)
备选方案:when函数自定义逻辑实现
如果需要额外加判断逻辑,可以用when函数逐列处理,支持批量遍历所有字符串列:
from pyspark.sql.functions import when, col from pyspark.sql.types import StringType # 批量遍历所有字符串类型的列,替换'?'为NULL for col_name in d.columns: if isinstance(d.schema[col_name].dataType, StringType): d = d.withColumn(col_name, when(col(col_name) == '?', None).otherwise(col(col_name))) # 后续删除空值逻辑同上 d = d.dropna()
注意事项
- PySpark DataFrame是不可变对象,所有修改操作都会返回新的DataFrame,必须赋值给变量才能保存修改结果
- 不建议将分布式PySpark DataFrame转为pandas DataFrame处理,数据量超过Driver节点内存时会直接触发OOM,优先用PySpark原生分布式API
内容的提问来源于stack exchange,提问作者user16214990
相关产品推荐
相关产品推荐

