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

PySpark DataFrame子串过滤:解决代码繁琐与性能低下问题咨询

PySpark百万级DataFrame文本过滤优化问题

场景说明

我手里有个几百万行的PySpark DataFrame(名为message_df),结构只有id和message两列,示例数据如下:

idmessage
ab123Hello my name is Chris
cd345The room should be 2301
ef567Welcome! What is your name?
gh873That way please
kj893The current year is 2022

我有两个关键词列表:

wanted_words = ['name','room']
unwanted_words = ['welcome','year']

需要筛选出满足两个条件的行:message列包含任意wanted_words中子串且完全不包含unwanted_words里的任何子串,预期结果是这样的:

idmessage
ab123Hello my name is Chris
cd345The room should be 2301

当前实现的问题

方案1:逐个用contains判断

我一开始写的代码逻辑没问题,但如果关键词有几百个,写起来会异常繁琐:

import pyspark.sql.functions as F

message_df.select(F.lower(F.col('message'))).filter(
    (
        F.col('lower(message)').contains('name') |
        F.col('lower(message)').contains('room') 
    ) & (
        ~F.col('lower(message)').contains('welcome') &
        ~F.col('lower(message)').contains('year') 
    )  
)

方案2:用rlike正则匹配

后来改成正则表达式简化代码,结果运行速度直接暴跌,性能表现极差:

wanted_pattern = "(name|room)"
unwanted_pattern = "(welcome|year)"

message_df.select(F.lower(F.col('message'))).filter(
   ~F.col('lower(message)').rlike(unwanted_pattern) &
    F.col('lower(message)').rlike(wanted_pattern)
)

核心疑问

  1. rlike的性能确实比contains差很多吗?
  2. 如果wanted_words和unwanted_words各有几百个词,有没有更高效的过滤方案?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:30:44