pyspark中的内部反连接[重复]

Posted

技术标签:

【中文标题】pyspark中的内部反连接[重复]【英文标题】:Inner anti join in pyspark [duplicate] 【发布时间】:2020-11-01 14:22:27 【问题描述】:

我正在尝试在 pyspark 中进行内部反连接。例如,我在两个 df 中都有一个公共键,现在我需要提取所有在两个 df 中不常见的行。即一个人的 id 不应该与另一个人的 id 匹配。

df1=df1.join(df2,how='inner',df1.id !=df2.id)

但是通过这段代码,我得到了两个 df 中这些 id 相同的行。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

也许你可以试试left anti join -

df3 = df1.join(df2, df1['id']==df2['id'], how='left_anti')
df4 = df2.join(df1, df1['id']==df2['id'], how='left_anti')
final_df = df3.unionAll(df4)

所以我们做了两次left anti join 然后union

【讨论】:

【参考方案2】:

Spark 允许您以多种方式处理此类用例

1.使用 except : 将返回一个新的 DataFrame,其中包含 dataFrame1 中的行,但不包含 dataframe2 中的行。 df1.except(df2)

2。使用减法,返回一个新的 DataFrame,该 DataFrame 包含此 DataFrame 中的行,但不包含另一个 DataFrame 中的行。

df1.subtract(df2)

3.使用 exceptAll() :返回一个新的 DataFrame,该 DataFrame 包含此 DataFrame 中的行,但不包含另一个 DataFrame 中的行,同时保留重复项。

df1.exceptAll(df2)

4.使用 left_anti 连接:作为 DF1 和 DF2 一部分的密钥存在,不应成为结果数据集的一部分

df = df1.join(df2, df1.key == df2.key, "left_anti")

【讨论】:

以上是关于pyspark中的内部反连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:内部连接两个 pyspark 数据帧并从第一个数据帧中选择所有列,从第二个数据帧中选择几列

数据框在多列上连接,pyspark中的列有一些条件[重复]

python + pyspark:在pyspark中进行多列比较的内部连接错误

pyspark 内连接的替代方法来比较 pyspark 中的两个数据帧

在 pyspark sql 的连接中重复使用相同的数据框视图

如何通过不同级别的枢轴聚合然后在pyspark中进行内部连接?