我有两个表-一个是具有一对ID(PC1和P2)和一些Blob数据(P3)的核心数据。另一个是前一个表中PC1的黑名单数据。我将第一个表称为in_df,第二个表称为blacklist_df。

我想做的就是只要in_df.PC1 == blacklist_df.P1和in_df.P2 == black_list_df.B1从in_df中删除行。这是一个代码片段,以显示我想要更明确地实现的目标。

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加入,但没有成功。谢谢!

最佳答案

将联接条件作为列表传递给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|
+---+---+---+

关于pyspark - 如何在某些匹配条件下左抗加入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51343937/

10-10 14:48