PySpark清洗名称字段:去除点号多余空格、转小写并提取去重值
PySpark 名称字段清洗+去重实现方案
问题说明
待处理的名称类DataFrame字段存在三类格式异常:
- 缩写后缀带多余点号
- 字符间存在连续多个空格
- 大小写不统一
你当前写的代码仅实现了点号移除,没有覆盖多余空格处理、大小写统一的逻辑。
原始数据样例:
N. Plainfield North Plainfield West Home Land NEWYORK newyork So. Plainfield S. Plaindield
清洗规则要求:
- 移除所有点号
- 连续空格合并为单个空格,保证缩写和后续名称、单词和单词之间仅留1个空格
- 所有字符统一转为小写
- 清洗完成后对字段值去重
实现代码
直接用PySpark内置函数按顺序做正则替换、大小写转换、去重即可,不需要自定义UDF,执行性能更好:
from pyspark.sql.functions import regexp_replace, lower, trim, col # 第一步:移除所有点号 names_clean = names.withColumn( "name_clean", regexp_replace(col("name"), r"\.", "") ) # 第二步:把连续1个以上的空白字符替换为单个空格,解决多空格问题 names_clean = names_clean.withColumn( "name_clean", regexp_replace(col("name_clean"), r"\s+", " ") ) # 第三步:统一转小写 names_clean = names_clean.withColumn( "name_clean", lower(col("name_clean")) ) # 可选:如果需要去掉字段首尾的多余空格,加这一步,不需要可以注释 # names_clean = names_clean.withColumn("name_clean", trim(col("name_clean"))) # 清洗完成后去重,仅保留清洗后字段的唯一值 names_dedup = names_clean.select("name_clean").distinct() # 如果需要保留原表其他字段,用下面这行代替上面的去重代码,按清洗后的字段去重保留首条记录 # names_dedup = names_clean.dropDuplicates(["name_clean"])
效果说明
执行完清洗步骤后,字段值会统一为:
n plainfield north plainfield west home land newyork newyork so plainfield s plainfield
去重后输出结果为:
n plainfield north plainfield west home land newyork so plainfield s plainfield
你给出的预期去重样例中存在空行、尾部多余空格,属于原始样例的格式误差,开启
trim步骤即可消除首尾空格,根据实际业务需求选择是否开启即可。
内容的提问来源于stack exchange,提问作者jacky789
相关产品推荐
相关产品推荐

