我想合并几个具有很少不同列的DataFrame。 假设,
DataFrame A有3列:Column_1,Column_2,Column 3
DataFrame B有3列:Column_1,Columns_2,Column_4
DataFrame C有3列:Column_1,Column_2,Column_5
我想合并这些DataFrame,以便获得一个DataFrame,如:
Column_1,Column_2,Column_3,Column_4 Column_5
DataFrame的数量可能会增加。有没有办法让这次合并?这样,对于特定的Column_1 Column_2组合,我得到同一行中其他三列的值,如果对于Column_1 Column_2的特定组合,某些列中没有数据,那么它应该在那里显示为空。
DataFrame A:
Column_1 Column_2 Column_3
1 x abc
2 y def
DataFrame B:
Column_1 Column_2 Column_4
1 x xyz
2 y www
3 z sdf
A和B的合并:
Column_1 Column_2 Column_3 Column_4
1 x abc xyz
2 y def www
3 z null sdf
答案 0 :(得分:6)
如果我正确理解您的问题,您需要使用一系列列作为键来执行外连接。
我使用了您问题中提供的数据来说明如何使用示例完成:
scala> val df1 = Seq((1,"x","abc"),(2,"y","def")).toDF("Column_1","Column_2","Column_3")
// df1: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_3: string]
scala> val df2 = Seq((1,"x","xyz"),(2,"y","www"),(3,"z","sdf")).toDF("Column_1","Column_2","Column_4")
// df2: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_4: string]
scala> val df3 = df1.join(df2, Seq("Column_1","Column_2"), "outer")
// df3: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_3: string, Column_4: string]
scala> df3.show
// +--------+--------+--------+--------+
// |Column_1|Column_2|Column_3|Column_4|
// +--------+--------+--------+--------+
// | 1| x| abc| xyz|
// | 2| y| def| www|
// | 3| z| null| sdf|
// +--------+--------+--------+--------+
使用给定的列称为equi-join
,另一个DataFrame
。
它与其他连接函数不同,连接列只会在输出中出现一次,即类似于SQL的JOIN USING
语法。
注意强>
自Spark 1.6以来,外部均衡连接可用。
答案 1 :(得分:0)
首先对所有三个数据帧使用以下代码,以便可以在数据帧上实现SQL查询
DF1.createOrReplaceTempView("df1view")
DF2.createOrReplaceTempView("df2view")
DF3.createOrReplaceTempView("df3view")
然后使用此join命令合并
val intermediateDF = spark.sql("SELECT a.column1, a.column2, a.column3, b.column4 FROM df1view a leftjoin df2view b on a.column1 = b.column1 and a.column2 = b.column2")`
intermediateDF.createOrReplaceTempView("imDFview")
val resultDF = spark.sql("SELECT a.column1, a.column2, a.column3, a.column4, b.column5 FROM imDFview a leftjoin df3view b on a.column1 = b.column1 and a.column2 = b.column2")
这些联接也可以在一个联接中一起完成,因为你想要所有的column1和column2值,你可以使用full outer join
而不是left join