Python 如何使用精确匹配动态筛选Spark数据帧中的行?

Python 如何使用精确匹配动态筛选Spark数据帧中的行?,python,apache-spark,filter,pyspark,Python,Apache Spark,Filter,Pyspark,我有一本这样的字典 dict = { "ColA": "A", "ColB": "B" } 我想使用此字典删除数据帧df中的一行,前提是该行与字典中的每个值完全匹配 因此,使用输入数据帧 +------+------+ | ColA | ColB | +------+------+ | A | A | | A | B | | B | B | +------+------+ 输出将是 +------+------+ | ColA | ColB | +----

我有一本这样的字典

dict = {
"ColA": "A",
"ColB": "B"
}
我想使用此字典删除数据帧df中的一行,前提是该行与字典中的每个值完全匹配

因此,使用输入数据帧

+------+------+
| ColA | ColB |
+------+------+
| A    | A    |
| A    | B    |
| B    | B    |
+------+------+
输出将是

+------+------+
| ColA | ColB |
+------+------+
| A    | A    |
| B    | B    |
+------+------+
我试过这样的东西

对于dict中的col: df=df.filterdf_to_upsert[col]!=行[列]
但是,这只会过滤掉行dict中具有任何匹配值的行,因此在这种情况下,数据帧中的每一行都将被过滤。

使用reduce函数的典型情况:

from pyspark.sql.functions import col
from functools import reduce

cond = reduce(lambda x,y: x|y, [ col(k)!=v for k,v in dict.items() ])

df.filter(cond).show()
+----+----+
|ColA|ColB|
+----+----+
|   A|   A|
|   B|   B|
+----+----+

谢谢@jxc,虽然它看起来有点神秘,但效果很好。你介意解释一下这里发生了什么吗?@Josh列表理解在数组上迭代,检查k列是否与值不同。然后reduce执行列或操作。如果列表中的任何值为真,则输出为真。