Pyspark Dataframe-如何筛选出在另一个数据帧中匹配的记录?

Pyspark Dataframe-如何筛选出在另一个数据帧中匹配的记录?,dataframe,apache-spark,pyspark,Dataframe,Apache Spark,Pyspark,我在Spark中有2个数据帧 DF1: c1,c2 a,1 b,2 c,3 c1,c2 d,4 e,5 a,6 c1,c2 b,2 c,3 DF2: c1,c2 a,1 b,2 c,3 c1,c2 d,4 e,5 a,6 c1,c2 b,2 c,3 我想从DF1中选择所有记录,但DF2中C1列匹配的记录除外(值“a”在第二个数据帧中,因此需要从第一个数据帧中筛选出该记录)。 结果应该是: DF3: c1,c2 a,1 b,2 c,3 c1,c2 d,4 e,5 a,6 c1,c2

我在Spark中有2个数据帧

DF1:

c1,c2
a,1
b,2
c,3
c1,c2
d,4
e,5
a,6
c1,c2
b,2
c,3
DF2:

c1,c2
a,1
b,2
c,3
c1,c2
d,4
e,5
a,6
c1,c2
b,2
c,3
我想从DF1中选择所有记录,但DF2中C1列匹配的记录除外(值“a”在第二个数据帧中,因此需要从第一个数据帧中筛选出该记录)。

结果应该是:

DF3:

c1,c2
a,1
b,2
c,3
c1,c2
d,4
e,5
a,6
c1,c2
b,2
c,3

您可以使用
exceptAll
作为

df3 = df1.select("C1").exceptAll(df2.select("C1"))

result = df1.join(df3, df1.C1 == df3.C1).drop(df3.C1)


您正在寻找一个
left-anti
join:
df1.join(df2,on=“c1”,how=“leftanti”)
和@Joe的可能副本我有另一个性能更好的解决方案-谢谢!您知道当2列或3列需要匹配时是否可以这样做吗?(而不是示例中的1)
result=df1.join(df3,df1.C1==df3.C1)
将添加另一个额外的列。删除它(不包括它)的最佳方法是什么?可能在子句中添加
left\u semi
。@Joe删除它的最佳方法是调用
df.drop(df.columnName))
但是
结果
dataframe有两个同名列(在第一个和最后一个位置)。。因此,按名称删除它是不明确的。。也许我应该在
df3
中重命名它。。