多OR条件的DataFrame筛选出现异常,链式WHERE运行正常
PySpark DataFrame筛选逻辑错误排查
问题核心是你混淆了**逻辑或(|)和逻辑与(&)**的用法:
错误代码逻辑分析
你最初的代码使用了|(逻辑或)连接三个条件:
df.where((F.col("A") != F.col("B")) | \ (F.col("A").isNotNull()) | \ (F.col("C") == F.col("D"))).show()
这段代码的逻辑是:只要三个条件任意一个成立,记录就会被保留。所以必然会出现只满足其中一个条件、不满足另外两个的记录,也就是你看到的“违反部分条件的实例”。
正确代码逻辑等价写法
你调整后的链式.where()调用,本质是逻辑与的关系——每个.where()都会在上一次筛选的结果上再过滤,只有同时满足所有条件的记录才会被保留:
df.where((F.col("A") != F.col("B"))) .where((F.col("A").isNotNull())) .where((F.col("C") == F.col("D")))
这段代码等价于用&(逻辑与)连接条件的单个.where()写法:
df.where( (F.col("A") != F.col("B")) & (F.col("A").isNotNull()) & (F.col("C") == F.col("D")) ).show()
注意事项
PySpark中使用逻辑运算符时,务必给每个条件单独加括号,避免因运算符优先级导致的逻辑错误。
内容的提问来源于stack exchange,提问作者madst
相关产品推荐
相关产品推荐

