如何将DataFrame列中仅含空白字符的字符串替换为None
Spark DataFrame全空白字符串替换为Null的修正方案
错误原因
- 直接向
regexp_replace第三个参数传入None时,Spark会无视正则匹配结果,直接将整列返回为Null,这是你整列数据都变为Null的核心原因。 - 额外添加的
F.trim处理会先删除原字符串的前后空格,就算后续逻辑正确,也会破坏带前后空格的有效字符串格式,不符合你的需求。
正确实现方案
你可以通过when条件判断实现需求,有两种常用写法:
写法1:正则匹配全空白字符串
直接匹配原字符串是否完全由空白字符组成,匹配成功则替换为Null,否则保留原值:
from pyspark.sql import functions as F df = df.withColumn( 'TITLE_LINE_3', F.when(F.col('TITLE_LINE_3').rlike(r'^\s*$'), None).otherwise(F.col('TITLE_LINE_3')) )
正则^\s*$会匹配从开头到结尾全为空白字符的内容(包括空串、全空格、制表符、换行符等空白类型)。
写法2:trim后判空(更简洁)
对原字符串做trim后如果为空,说明原内容全为空白字符,直接替换为Null即可,不会修改原有效字符串的前后空格:
from pyspark.sql import functions as F df = df.withColumn( 'TITLE_LINE_3', F.when(F.trim(F.col('TITLE_LINE_3')) == '', None).otherwise(F.col('TITLE_LINE_3')) )
两种写法都完全符合你的示例要求:全空白字符串变为Null,带前后空格的有效字符串和正常字符串都会保留原值。
内容的提问来源于stack exchange,提问作者user1768029
相关产品推荐
相关产品推荐

