如何用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
相关产品推荐
相关产品推荐

