Pyspark Dataframe - 如何过滤掉另一个数据框中匹配的记录?

Posted

技术标签:

【中文标题】Pyspark Dataframe - 如何过滤掉另一个数据框中匹配的记录?【英文标题】:Pyspark Dataframe - How to filter out records that are matching in another dataframe? 【发布时间】:2020-01-22 22:23:54 【问题描述】:

我在 Spark 中有 2 个数据框。

DF1:

c1,c2
a,1
b,2
c,3

DF2:

c1,c2
d,4
e,5
a,6

我想从 DF1 中选择所有记录,除了 DF2 中 C1 列匹配的记录(值“a”在第二个数据帧中,因此需要从第一个数据帧中过滤掉该记录)。 结果应该是:DF3:

c1,c2
b,2
c,3

【问题讨论】:

您正在寻找left-anti 加入:df1.join(df2, on="c1", how="leftanti") How to LEFT ANTI join under some matching condition 和 What are the various join types in Spark? 的可能重复 @Joe 我还有另一个性能更高的解决方案 - ***.com/questions/59886077/… 【参考方案1】:

你可以使用exceptAll作为

df3 = df1.select("C1").exceptAll(df2.select("C1"))

result = df1.join(df3, df1.C1 == df3.C1).drop(df3.C1)

【讨论】:

谢谢!您知道当需要匹配 2 列或 3 列时是否可以这样做? (而不是示例中的 1) result = df1.join(df3, df1.C1 == df3.C1) 将添加另一个额外的列。删除它(不包括它)的最佳方法是什么? 可以在子句中添加left_semi @Joe 删除它的最佳方法是致电df.drop(df.columnName)) result 数据框有 2 列同名(在第 1 和最后位置).. 所以按名称删除它是不明确的.. 也许我应该在 df3.. 中重命名它/跨度>

以上是关于Pyspark Dataframe - 如何过滤掉另一个数据框中匹配的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pyspark.rdd.PipelinedRDD 中过滤掉值?

如何在过滤器pyspark RDD中过滤掉某种模式[重复]

如何根据来自其他 pyspark 数据帧的日期值过滤第二个 pyspark 数据帧?

pyspark 使用过滤器应用 DataFrame 窗口函数

当列文本包含超过 10 个单词时过滤 pyspark DataFrame

PySpark:在日期为字符串的范围内按日期字段过滤DataFrame