如何在某些匹配条件下 LEFT ANTI 加入
Posted
技术标签:
【中文标题】如何在某些匹配条件下 LEFT ANTI 加入【英文标题】:How to LEFT ANTI join under some matching condition 【发布时间】:2018-07-14 22:40:13 【问题描述】:我有两个表 - 一个是带有一对 ID(PC1 和 P2)和一些 blob 数据(P3)的核心数据。另一个是前表中PC1的黑名单数据。我将调用第一个表 in_df 和第二个 blacklist_df。
我想要做的是从 in_df 中删除行,只要 in_df.PC1 == blacklist_df.P1 和 in_df.P2 == black_list_df.B1。这是一个代码 sn-p 来更明确地显示我想要实现的目标。
in_df = sqlContext.createDataFrame([[1,2,'A'],[2,1,'B'],[3,1,'C'],
[4,11,'D'],[1,3,'D']],['PC1','P2','P3'])
in_df.show()
+---+---+---+
|PC1| P2| P3|
+---+---+---+
| 1| 2| A|
| 2| 1| B|
| 3| 1| C|
| 4| 11| D|
| 1| 3| D|
+---+---+---+
blacklist_df = sqlContext.createDataFrame([[1,2],[2,1]],['P1','B1'])
blacklist_df.show()
+---+---+
| P1| B1|
+---+---+
| 1| 2|
| 2| 1|
+---+---+
最终我想要得到的是以下内容:
+---+--+--+
|PC1|P2|P3|
+---+--+--+
| 1| 3| D|
| 3| 1| C|
| 4|11| D|
+---+--+--+
我尝试了 LEFT_ANTI 加入,但没有成功。
【问题讨论】:
【参考方案1】:将连接条件作为列表传递给join
函数,并指定how='left_anti'
作为连接类型:
in_df.join(
blacklist_df,
[in_df.PC1 == blacklist_df.P1, in_df.P2 == blacklist_df.B1],
how='left_anti'
).show()
+---+---+---+
|PC1| P2| P3|
+---+---+---+
| 1| 3| D|
| 4| 11| D|
| 3| 1| C|
+---+---+---+
【讨论】:
以上是关于如何在某些匹配条件下 LEFT ANTI 加入的主要内容,如果未能解决你的问题,请参考以下文章
Redshift 在多个条件下加入,但仅在一个条件不匹配时返回