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

如何用PySpark和SQL在DataFrame列中搜索复杂预定义正则表达式?

问题原因及解决方案

你之前的代码没有返回结果,核心原因是dataframe1中存储的正则表达式格式错误——你写了rlike(test[1-9]),但rlike()是PySpark的方法名,正则本身只需要test[1-9]即可。修正正则后,我们可以用PySpark和SQL两种方式实现需求。

先修正原始DataFrame

首先把dataframe1的正则改为正确格式:

dataframe1 = spark.createDataFrame([
 ('test[1-9]',)
], ['regex_pattern'])

dataframe2 = spark.createDataFrame([
    ('text with test1',),
    ('text with test2',),
    ('text with test3',),
    ('text without match',)
], ['column1'])

PySpark实现方式

方式1:逐个正则匹配并输出(对应你原来的循环逻辑)

修正正则后,循环遍历每个正则并筛选:

from pyspark.sql.functions import col

for row in dataframe1.collect():
    regex_pattern = row.regex_pattern    
    filtered_df = dataframe2.filter(col('column1').rlike(regex_pattern))    
    print(f"匹配结果(正则:{regex_pattern})")
    filtered_df.show()
    print("----------------------------------")

运行后会输出匹配到的3条数据。

方式2:关联DataFrame,一次性获取所有匹配结果(保留匹配的正则)

如果需要把所有正则的匹配结果合并,同时标记每条数据匹配的正则,可以用笛卡尔积+过滤的方式:

from pyspark.sql.functions import col

# 关联两个DataFrame,然后过滤匹配的行
matched_df = dataframe1.crossJoin(dataframe2) \
    .filter(col('column1').rlike(col('regex_pattern'))) \
    .select('regex_pattern', 'column1')

matched_df.show()

输出结果会包含匹配的正则和对应的文本行。


SQL实现方式

先将两个DataFrame注册为临时视图,然后用SQL语句完成匹配:

# 注册临时视图
dataframe1.createOrReplaceTempView("regex_table")
dataframe2.createOrReplaceTempView("text_table")

# 执行SQL查询
matched_sql_df = spark.sql("""
    SELECT rt.regex_pattern, tt.column1
    FROM regex_table rt
    CROSS JOIN text_table tt
    WHERE tt.column1 RLIKE rt.regex_pattern
""")

matched_sql_df.show()

这个SQL查询和PySpark方式2的逻辑一致,会返回所有匹配的正则与文本的组合。


内容的提问来源于stack exchange,提问作者VSe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:05:18