首页 > 解决方案 > 如何动态过滤出具有完全匹配的 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,因此在这种情况下,数据框中的每一行都会被过滤。

标签: pythonapache-sparkfilterpyspark

解决方案


使用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|
+----+----+

推荐阅读