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

PySpark多AND/OR条件逻辑修正:无法得到预期布尔结果

修正后的PySpark过滤逻辑

首先,你的代码存在两个关键问题导致结果不符合预期:

1. 匹配Text2的Like表达式不完整

你写的F.col("Col1").like("%Text2")缺少结尾的%,这只能匹配以Text2结尾的字符串,无法稳定匹配任意位置出现的Text2(比如若数据是Text2; Random就会匹配失败),需要改为%Text2%才能匹配Col1中任意位置的Text2。

2. Col2的逻辑条件错误

结合你的预期结果(第一行False,第二行True),你实际需要的逻辑是Col2既不包含12345,也不包含67890。根据布尔逻辑规则,这可以写成两种等价形式:

  • 直接逻辑:~F.col("Col2").like("%12345%") & ~F.col("Col2").like("%67890%")
  • 德摩根定律等价形式:~(F.col("Col2").like("%12345%") | F.col("Col2").like("%67890%"))

而你原来写的~F.col("Col2").like("%12345%") | ~F.col("Col2").like("%67890%")对应的是Col2不同时包含12345和67890,和你的预期逻辑不符。


修正后的完整代码

import pyspark.sql.functions as F

# 定义过滤条件
filter_condition = (
    (F.col("Col1").like("%Text1%") | F.col("Col1").like("%Text2%"))
    &
    F.col("Col3").like("%Text3%")
    &
    ~(F.col("Col2").like("%12345%") | F.col("Col2").like("%67890%"))
)

# 为数据集添加结果列
df = df.withColumn("result", filter_condition)

验证结果

针对你的输入数据集:

Col1Col3Col2
Text1; RandomText3; Random12345;67890;34567
Random; Text2Text398765;54321

运行修正后的代码后,result列的结果为:

  • 第一行:False(Col2包含12345和67890,不满足第三条件)
  • 第二行:True(所有条件均满足)

完全符合你的预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:45:33