You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:51:25