【问题标题】:How to dynamically filter out rows in a Spark dataframe with an exact match?如何动态过滤出具有完全匹配的 Spark 数据帧中的行?
【发布时间】:2020-01-27 07:56:37
【问题描述】:

我有一本这样的字典

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 中具有任何匹配值的行,因此在这种情况下,数据框中的每一行都会被过滤掉。

【问题讨论】:

    标签: python apache-spark filter pyspark


    【解决方案1】:

    使用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 执行按列的OR 操作。如果列表中的任何值为True,则输出将为True
    猜你喜欢
    • 2020-07-19
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2018-02-18
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多