You need to enable JavaScript to run this app. PySpark如何筛选含zodiac且无nonzodiac标识的DataFrame记录
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 08:06:03