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)
验证结果
针对你的输入数据集:
| Col1 | Col3 | Col2 |
|---|---|---|
| Text1; Random | Text3; Random | 12345;67890;34567 |
| Random; Text2 | Text3 | 98765;54321 |
运行修正后的代码后,result列的结果为:
- 第一行:
False(Col2包含12345和67890,不满足第三条件) - 第二行:
True(所有条件均满足)
完全符合你的预期输出。
内容的提问来源于stack exchange,提问作者SaurabhShelar
相关产品推荐
相关产品推荐

