我有两个过滤器,其中一个过滤器检查精确匹配&将收集该项,第二个过滤器将查找两个不同的匹配项。如果第一个过滤器为真,第二个过滤器应该覆盖第一个过滤器。
过滤器1示例:
df = df_vals.where(F.col("x" == 1a)).select()
过滤器2示例:
df = df_vals.where(F.col("x" == 1a | "x" == 2b ) | f.col("x" == 1a | F.col("x" == 2c)).select(items in list)
所以我需要关于如何覆盖第一个过滤器的建议,如果第二个过滤器在PySpark中也是true。理想情况下,只有当第二个过滤器不为真时,第一个过滤器才会通过。
对于特定列的特定行,如果x
已经具有1a
的值,那么它不能是2b
,因为它被分配给1a
是对的吗?你确定要在第二个过滤器中使用or
吗?如果是这种情况,Filter 1
被认为是在Filter 2
,因为你总是寻找1a
…你能更新你的问题以包含期望的输出吗?使用模拟数据是可以的。
样本dataframe……我添加了y
列作为稍后过滤器的参考。
+---+---+
| x| y|
+---+---+
| 1a| 1|
| 1a| 2|
| 2b| 3|
| 2c| 4|
| 2b| 5|
| 1a| 6|
| 1a| 7|
| zz| 8| // to be ignored
| zz| 9| // to be ignored
| zz| 10| // to be ignored
| zz| 11| // to be ignored
+---+---+
在
下面应用滤镜df.where(
((F.col('x') == '1a') | (F.col('x') == '2b')) |
((F.col('x') == '1a') | ((F.col('x') == '2c'))))
.show()
将给你这个结果,x
列中具有zz
值的行将根据上面的过滤器被忽略。
+---+---+
| x| y|
+---+---+
| 1a| 1|
| 1a| 2|
| 2b| 3|
| 2c| 4|
| 2b| 5|
| 1a| 6|
| 1a| 7|
+---+---+