PySpark如何在字符串列中高效批量检查多个子字符串是否存在
多子串模糊匹配PySpark实现方案
单字符串包含匹配的常用写法如下,可筛选列值包含指定子串的所有行:
df_filtered = df.filter(df.columnName.contains('abc'))
如果需要同时匹配多个子串(如匹配['ab1','cd2','ef3']中任意一个子串存在),且避免使用for循环、适配上千规模的子串列表,可使用正则匹配的方案,直接调用Spark原生的rlike算子实现。
实现步骤
- 处理子串列表,转义正则特殊字符后拼接为「或」逻辑的正则表达式
- 调用
rlike算子传入正则完成过滤
完整代码示例
import re # 待匹配的子串列表,支持上千规模 search_words = ['word1', 'word2', 'word3'] # 转义每个子串的正则特殊字符,避免.、*、?等字符被当成正则语法解析 processed_words = [re.escape(word) for word in search_words] # 拼接为或逻辑正则 regex = '|'.join(processed_words) # 执行过滤,匹配列值包含任意一个子串的行 df_filtered = df.filter(df.columnName.rlike(regex))
方案说明
- 该方案所有逻辑下推到Spark引擎执行,没有本地循环开销,支持千级规模子串的高效匹配
- 匹配效果和需求一致,只要列值包含任意一个子串就会被筛选出来,例如"x_ab1"、"cd2"、"abef3"这类值都会命中
- 如果子串规模超过2000,可将列表拆分为多个小列表,分别生成正则后用
df.filter(df.columnName.rlike(regex1) | df.columnName.rlike(regex2))的方式组合,避免单个正则过长导致解析异常。
内容的提问来源于stack exchange,提问作者Manrique
相关产品推荐
相关产品推荐

