连接两个数据框列,而无需重复组合

时间:2019-03-25 10:23:43

标签: join pyspark inner-join

我想加入两个数据框的“项目”列。

Dataframe1(df1)
id    item
 1      1
 1      2 
 1      2

Dataframe2(df2)
_id    item
 44    1
 44    2
 44    2

我尝试了内部联接,以便返回匹配的值

 out= df1.join(df2,  df2.item==df1.item, 'inner')
 +---+----+----+---+
 | id|item|item|_id|
 +---+----+----+---+
 |  1| [1]| [1]| 44|
 |  1| [2]| [2]| 44|
 |  1| [2]| [2]| 44|
 |  1| [2]| [2]| 44|
 |  1| [2]| [2]| 44|
 +---+----+----+--- 

但是我想要以下结果而不包含重复的匹配组合

+---+----+----+---+
 | id|item|item|_id|
 +---+----+----+---+
 |  1| [1]| [1]| 44|
 |  1| [2]| [2]| 44|
 |  1| [2]| [2]| 44|
 +---+----+----+---+

另一个例子可能是

Dataframe1(df1)
id    item
 1      1
 1      2 
 1      1

Dataframe2(df2)
_id    item
 44    1
 44    2

结果应为

+---+----+----+---+
| id|item|item|_id|
 +---+----+----+---+
 |  1| [1]| [1]| 44|
 |  1| [2]| [2]| 44|
 +---+----+----+---+

3 个答案:

答案 0 :(得分:1)

实现这一目标的最优化方法是使用 LEFT SEMI JOIN -

df1 = spark.createDataFrame([(1,1),(1,2),(1,2)],['id','item'])
df2 = spark.createDataFrame([(44,1),(44,2),(44,2)],['id','item'])

df1.join(df2,  df2.item==df1.item, 'left_semi').show()

答案 1 :(得分:0)

尝试一下:

选择不同的a.id,a.item,b.id,b.item 来自df1 a   内部连接df2 b   在a.item = b.item上 按a.item排序;

它肯定会解决您的问题。

答案 2 :(得分:0)

使用drop_duplicates()

out= df1.join(df2,  df2.item==df1.item, 'inner').drop_duplicates()