2016-10-03 127 views
2

我想合并具有几个不同列的几个DataFrame。 假设,合并具有几个不同列的两个数据帧

数据帧A具有3列:COLUMN_1 COLUMN_2列3

数据帧B具有3列:COLUMN_1 Columns_2 Column_4

数据帧C具有3列:COLUMN_1 COLUMN_2 Column_5

欲合并这些数据帧,使我得到一个DataFrame:

Column_1 Column_2 Column_3 Column_4 Column_5

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

数据框答:

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 
+0

我不知道我明白你的问题。你想举个例子输入和输出吗? – eliasah

+0

@eliasah添加了示例。 –

回答

5

如果我正确理解你的问题,你会需要使用一系列列作为关键字来执行外连接

我已经用在你的问题中提供的数据来说明它是如何用一个例子做:

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| 
// +--------+--------+--------+--------+ 

这是利用给定的列被称为与另一DataFrameequi-join

它与其他连接函数不同,连接列只会在输出中出现一次,即与SQL的JOIN USING语法类似。

+0

当我运行与您所提到的相同的代码时,出现此错误第三步: 错误:type mismatch; found:Seq [String] required:org.apache.spark.sql.Column val outputdf_1 = df1.join(df2,Seq(“Column_1”,“Column_2”),“outer”) –

+0

哪个版本的spark是你在用吗? – eliasah

+0

我使用的是1.5版本 –

0

下列全部三个数据帧代码首先使用,使SQL查询可以在dataframes实施

DF1.createOrReplaceTempView("df1view") DF2.createOrReplaceTempView("df2view") DF3.createOrReplaceTempView("df3view")

然后使用这个连接命令合并

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")

这些加盟也可以一起做一个连接,也因为你想列1列2和的所有值,你可以使用的full outer join代替left join

相关问题