如何在PySpark中使用.contains()实现单个或多个子字符串过滤
Spark DataFrame多子字符串模糊匹配过滤实现方案
方案1:动态拼接contains条件
适合子字符串可能包含正则特殊字符的场景,不需要处理转义逻辑,直接通过functools.reduce拼接多个contains的或条件:
from pyspark.sql import functions as spark_fns from functools import reduce import operator # 预设子字符串参数,支持1个或多个 substring_list = ["JFK", "ABC"] # 构造过滤条件 filter_condition = reduce( operator.or_, [spark_fns.col("String").contains(sub) for sub in substring_list] ) # 执行过滤 filtered_sdf = sdf.filter(filter_condition)
如果需要匹配所有子串都存在的与逻辑,把operator.or_换成operator.and_即可。
方案2:使用rlike正则匹配
代码更简洁,子串数量较多时性能更优,只需要把所有子串拼接为正则的或规则即可:
import re from pyspark.sql import functions as spark_fns substring_list = ["JFK", "ABC"] # 注意:如果子串包含正则特殊字符(.、*、+、?等),需要用re.escape转义 regex_pattern = "|".join([re.escape(sub) for sub in substring_list]) filtered_sdf = sdf.filter(spark_fns.col("String").rlike(regex_pattern))
两种方案对比
- 子串数量少于10个时,两种方案性能无明显差异
- 子串包含大量正则特殊字符时优先选方案1,不需要额外处理转义
- 子串数量较多(>20个)时优先选方案2,Spark对正则匹配的优化更好
上述两种方案都支持传入任意长度(≥1)的子字符串列表,完全满足泛化需求。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

