PySpark DataFrame子串过滤:解决代码繁琐与性能低下问题咨询
PySpark百万级DataFrame文本过滤优化问题
场景说明
我手里有个几百万行的PySpark DataFrame(名为message_df),结构只有id和message两列,示例数据如下:
| id | message |
|---|---|
| ab123 | Hello my name is Chris |
| cd345 | The room should be 2301 |
| ef567 | Welcome! What is your name? |
| gh873 | That way please |
| kj893 | The current year is 2022 |
我有两个关键词列表:
wanted_words = ['name','room'] unwanted_words = ['welcome','year']
需要筛选出满足两个条件的行:message列包含任意wanted_words中子串且完全不包含unwanted_words里的任何子串,预期结果是这样的:
| id | message |
|---|---|
| ab123 | Hello my name is Chris |
| cd345 | The 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) )
核心疑问
rlike的性能确实比contains差很多吗?- 如果
wanted_words和unwanted_words各有几百个词,有没有更高效的过滤方案?
内容的提问来源于stack exchange,提问作者Curl
相关产品推荐
相关产品推荐

