PySpark如何筛选含zodiac且无nonzodiac标识的DataFrame记录
PySpark 精准筛选zodiac标识行的实现方法
问题根源
直接用rlike("zodiac")做匹配筛选时,由于nonzodiac本身包含zodiac子串,会同时命中两类标记的记录,无法单独保留纯zodiac标识的行。
常用实现方案
方案1:双条件排除(逻辑最易维护)
先筛出所有包含zodiac的记录,再通过逻辑非操作去掉其中包含nonzodiac的行,最终结果即为目标数据。
import pyspark.sql.functions as f zodiac_rows = df.where( f.col("col1").rlike("zodiac") & ~f.col("col1").rlike("nonzodiac") )
- 优势:逻辑直白无理解门槛,不存在正则语法写错的风险,哪怕zodiac/nonzodiac标记出现在字符串的任意位置都能适配,后期维护成本低。
方案2:负向断言正则单条件匹配
利用Java正则的零宽负向回顾断言,匹配字符串末尾位置的zodiac标记,同时校验zodiac的前序字符不是non组合,直接拦截nonzodiac的命中场景。
zodiac_rows = df.where(f.col("col1").rlike(r"(?<!non)zodiac$"))
- 匹配逻辑校验:
- 对
1234ESPNzodiac:结尾zodiac的前序字符为ESPN,符合匹配规则 - 对
1234ESPNnonzodiac:结尾zodiac的前序字符为non,被负向断言自动排除
- 对
- 优势:代码简洁,适配zodiac/nonzodiac标记固定在字符串末尾的场景。
方案3:内置字符串后缀比对(性能更优)
不依赖正则,直接调用Spark内置的字符串后缀判断函数,匹配性能优于正则表达式。
zodiac_rows = df.where( f.col("col1").endswith("zodiac") & ~f.col("col1").endswith("nonzodiac") )
- 优势:无正则语法要求,比对逻辑简单,执行效率高,适合所有标记固定为字符串后缀的场景。
内容的提问来源于stack exchange,提问作者sanjayr
相关产品推荐
相关产品推荐

