【问题标题】:How to LEFT ANTI join under some matching condition如何在某些匹配条件下 LEFT ANTI 加入
【发布时间】: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 加入,但没有成功。

【问题讨论】:

    标签: pyspark


    【解决方案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|
    +---+---+---+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2022-01-02
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多