连接2个pysaprk数据帧,并从连接中删除重复的行

时间:2019-07-08 18:35:53

标签: join pyspark apache-spark-sql

我正在尝试按2列加入2个pyspark数据帧,这些数据帧是:

df1 = pd.DataFrame()
df1["ID"] = ["1","1","2","5"]
df1["A"] = ["100","100","300","450"]
df1["Date"] = [2015,2019,2002,2003]
df1["Date2"] = [2000,2000,2000,2000]
df1 = sqlContext.createDataFrame(df1)

df2 = pd.DataFrame()
df2["ID"] = ["1","1","5","9"]
df2["A"] = ["100","100","450","250"]
df2["Z"] = [65,65,65,65]
df2 = sqlContext.createDataFrame(df2)

df1:

+---+---+----+-----+
| ID|  A|Date|Date2|
+---+---+----+-----+
|  1|100|2015| 2000|
|  1|100|2019| 2000|
|  2|300|2002| 2000|
|  5|450|2003| 2000|
+---+---+----+-----+

df2:

+---+---+---+
| ID|  A|  Z|
+---+---+---+
|  1|100| 65|
|  1|100| 65|
|  5|450| 65|
|  9|250| 65|
+---+---+---+

我要获取以下数据框:

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  2|300|2002| 2000|null|
+---+---+----+-----+----+

我尝试过:

new = df1.join(df2, ["ID","A"],how='full' )

谁会得到我的帮助

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  2|300|2002| 2000|null|
|  1|100|2015| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  1|100|2019| 2000|  65|
+---+---+----+-----+----+

然后我使用以下方法消除了重复项:

cols_join = new.columns
cols_join.remove("ID")
cols_join.remove("A")

new.dropDuplicates(subset=cols_join).show()

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  2|300|2002| 2000|null|
+---+---+----+-----+----+

有更好的方法吗?

我尝试了其他联接(左侧,内部等),但没有得到想要的结果

还有,有更好的方法来消除重复的行吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,必须具有完全联接,因为结果数据帧中有来自df1和df2的ID,A。

因此,其他联接类型(左,左半..)都不可行。

我认为没有什么可以做得更好。

为简化代码,您可以使用

new.dropDuplicates(['Date', 'Date2', 'Z'])