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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:00