如何在PySpark DataFrame中应用多个正则表达式模式
嘿,作为PySpark新手踩这些小坑太正常啦!我先帮你梳理下现有代码里的问题,再给你一套能正常工作的实现方案:
首先说下你现有代码的几个明显问题:
- 你错误地在处理列名的字符串,而不是列里的每条数据,这完全搞反了处理目标呀😂
- 用了
re.findall——这玩意儿是用来查找匹配内容的,你要做的是替换操作,得用re.sub才行 - 正则写的是sed的
s/.../.../格式,Python的re.sub不需要这个前缀,直接写匹配模式和替换值就可以 - 还有个拼写错误:
olumn_name少了个字母c,这运行起来肯定会报错
修正后的实现方案
我给你拆成几步来,这样你更容易理解和调整:
第一步:先写个处理单个字符串的函数
我们先把所有要做的正则替换逻辑写在一个普通Python函数里,专门处理单条文本——毕竟UDF本质就是把普通函数应用到DataFrame的每一行嘛。
import re from pyspark.sql.functions import udf from pyspark.sql.types import StringType def clean_group_name(input_str): # 先处理空值,避免None传入时报错 if not input_str: return input_str # 按你的需求做替换,把sed风格的正则改成Python能用的格式 # 替换" AND "为空格 input_str = re.sub(r' AND ', ' ', input_str) # 替换" ADVANCED "或" ADVANCE "为" ADV " input_str = re.sub(r' ADVANCED | ADVANCE ', ' ADV ', input_str) # 替换那些ASSOCI相关的前缀(你原代码没写完,我先按现有内容整理,你可以自己补全规则) input_str = re.sub(r' ASC | ASSOCI | ASSC | ASSOCIAT | ASSOCIA | ASSO | ASSOCS | AS | ASSOCIAT', ' AS ', input_str) # 可选:把首尾多余的空格去掉,让结果更干净 return input_str.strip()
第二步:把这个函数注册成PySpark UDF
PySpark不认识普通Python函数,得把它注册成UDF才能用到DataFrame上:
# 注册UDF,指定返回类型为字符串类型 clean_group_name_udf = udf(clean_group_name, StringType())
第三步:封装成你想要的接收DataFrame和列名的函数
现在把逻辑封装成你一开始想要的函数,传入DataFrame和列名,返回处理后的DataFrame:
def group_nm_transform(inDF, column_name): # 把UDF应用到指定列,这里直接覆盖原列;如果想生成新列,改下withColumn的第一个参数即可 return inDF.withColumn(column_name, clean_group_name_udf(inDF[column_name])) # 比如想生成新列叫cleaned_group_name: # return inDF.withColumn(f"cleaned_{column_name}", clean_group_name_udf(inDF[column_name]))
第四步:用起来试试!
假设你有个叫df的DataFrame,列名是group_name,直接调用就行:
cleaned_df = group_nm_transform(df, "group_name") cleaned_df.show()
额外小tip:性能优化
如果你的数据量特别大,UDF的性能可能不如PySpark内置的regexp_replace——毕竟UDF是跑在Python虚拟机里的,内置函数是原生Spark优化过的。给你个用内置函数的版本,不用写UDF也能实现相同效果:
from pyspark.sql.functions import regexp_replace, trim def group_nm_transform(inDF, column_name): return inDF.withColumn(column_name, trim( regexp_replace( regexp_replace( regexp_replace(inDF[column_name], r' AND ', ' '), r' ADVANCED | ADVANCE ', ' ADV ' ), r' ASC | ASSOCI | ASSC | ASSOCIAT | ASSOCIA | ASSO | ASSOCS | AS | ASSOCIAT', ' AS ' ) ) )
这个版本运行更快,更适合大数据场景~
内容的提问来源于stack exchange,提问作者marjun
相关产品推荐
相关产品推荐

