Apache spark 将两个数据帧合并为几个不同的列

Apache spark 将两个数据帧合并为几个不同的列,apache-spark,dataframe,apache-spark-sql,Apache Spark,Dataframe,Apache Spark Sql,我想合并几个不同列的数据帧。 假设 数据帧A有3列:列_1、列_2、列3 数据框B有3列:列_1、列_2、列_4 数据帧C有3列:列_1、列_2、列_5 我希望合并这些数据帧,以便得到如下数据帧: 第1列、第2列、第3列、第4列、第5列 数据帧的数量可能会增加。有没有办法得到这个合并?这样,对于一个特定的列\ 1列\ 2组合,我得到了同一行中其他三列的值,如果对于一个特定的列\ 1列\ 2组合,某些列中没有数据,那么它应该在那里显示null 数据帧A: Column_1 Column_2 C

我想合并几个不同列的数据帧。 假设

  • 数据帧A有3列:列_1、列_2、列3

  • 数据框B有3列:列_1、列_2、列_4

  • 数据帧C有3列:列_1、列_2、列_5

我希望合并这些数据帧,以便得到如下数据帧:

第1列、第2列、第3列、第4列、第5列

数据帧的数量可能会增加。有没有办法得到这个合并?这样,对于一个特定的列\ 1列\ 2组合,我得到了同一行中其他三列的值,如果对于一个特定的列\ 1列\ 2组合,某些列中没有数据,那么它应该在那里显示null

数据帧A:

Column_1 Column_2 Column_3
   1        x        abc
   2        y        def
数据帧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

如果我正确理解了您的问题,您将需要使用列序列作为键执行外部联接

我使用了您问题中提供的数据,通过一个示例来说明如何实现:

scala>val df1=Seq((1,“x”,“abc”),(2,“y”,“def”)).toDF(“列1”,“列2”,“列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(“第1列”、“第2列”、“第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
// +--------+--------+--------+--------+                                           
//|第1列|第2列|第3列|第4列|
// +--------+--------+--------+--------+
//| 1 | x | abc | xyz|
//| 2 | y | def | www|
//| 3 | z |空| sdf|
// +--------+--------+--------+--------+
这被称为使用给定列与另一个数据帧进行的
等联接

它与其他连接函数不同,连接列在输出中只出现一次,即类似于SQL的
使用
语法连接

注意


从Spark 1.6开始,外部equi联接就可用。

首先对所有三个数据帧使用以下代码,以便在数据帧上实现SQL查询

DF1.createOrReplaceTempView(“df1view”)
DF2.createOrReplaceTempView(“df2view”)
DF3.createOrReplaceTempView(“df3view”)
然后使用此join命令进行合并

val intermediateDF=spark.sql(“从df1view a中选择a.column1、a.column2、a.column3、b.column4左连接a.column1=b.column1和a.column2=b.column2上的df2view b”)`
intermediateDF.createOrReplaceTempView(“imDFview”)
val resultDF=spark.sql(“从imDFview中选择a.column1、a.column2、a.column3、a.column4、b.column5,并在a.column1=b.column1和a.column2=b.column2上左连接df3view b”)
这些联接也可以在一个联接中一起完成,而且由于您需要column1和column2的所有值,因此可以使用
完全外部联接
而不是
左联接