使用Spark regexp_replace()时为何DataFrame所有值都变为null?
问题根源
你的代码出现全列null是三个错误共同导致的:
regexp_replace()的第三个参数不支持直接传Python的None,传入None会被PySpark解析为不存在的列引用,直接返回全null值,这是所有值被置空的核心原因。- 正则模式中
?是特殊量词(代表匹配前序字符0次或1次),直接传"?"作为模式会匹配字符串中所有空位置,相当于给每一行都命中了替换规则。 - 你定义的
empty_str = "\\\"\\\""转义逻辑错误,根本无法匹配到反斜杠字符。
修复方法
根据你的实际需求二选一即可:
需求1:单元格值包含问号/反斜杠时,将整个单元格值替换为null
不要用regexp_replace,用when().otherwise()做条件判断,显式声明null字面量:
from pyspark.sql.functions import col, when, lit # 正则模式:匹配问号或反斜杠,raw字符串写法避免转义混乱 match_pattern = r'[?\\]' for column in df.columns: df = df.withColumn( column, # 匹配到目标字符就返回null,否则保留原值 when(col(column).rlike(match_pattern), lit(None)) .otherwise(col(column)) )
需求2:把字符串里的问号、反斜杠字符替换掉(保留单元格其他内容)
如果不需要把整个单元格置为null,只是删除其中的问号和反斜杠,给regexp_replace传空字符串作为替换值即可,同时修正正则转义:
from pyspark.sql.functions import col, regexp_replace match_pattern = r'[?\\]' for column in df.columns: # 第三个参数传空字符串,不要传None df = df.withColumn(column, regexp_replace(col(column), match_pattern, ""))
注意点
- 正则中匹配特殊字符必须转义:普通问号要写为
\?,普通反斜杠在正则中要写为\\,用Python raw字符串(字符串前加r)可以减少多层转义的出错概率。 - PySpark中要表示null字面量必须用
lit(None),不能直接传Python原生None。
内容的提问来源于stack exchange,提问作者kee1117
相关产品推荐
相关产品推荐

