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 数据帧的日期值过滤第二个 pyspark 数据帧?
pyspark 使用过滤器应用 DataFrame 窗口函数