2016-10-03 124 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

相關問題