python - 如何动态过滤出具有完全匹配的 Spark 数据帧中的行?
问题描述
我有一本像这样的字典
dict = {
"ColA": "A",
"ColB": "B"
}
我想使用这个字典来删除数据框中的一行df
,只有当该行与字典中的每个值完全匹配时。
所以使用输入数据框
+------+------+
| ColA | ColB |
+------+------+
| A | A |
| A | B |
| B | B |
+------+------+
输出将是
+------+------+
| ColA | ColB |
+------+------+
| A | A |
| B | B |
+------+------+
我尝试过这样的事情
for col in dict:
df = df.filter(df_to_upsert[col] != row[col])
但是,这只会过滤掉具有任何匹配值的行row_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|
+----+----+