2017-05-09 60 views
0

我把兩個dataframes,這是非常相似,這裏給出Joining two DataFrames in Spark SQL and selecting columns of only one如何在Scala中連接兩個數據框並根據其索引從數據框中選擇幾列?

不過,我想從df2只選擇第二列中的任務。在我的任務中,我將使用reduce函數中的兩個數據框的連接函數來獲取數據框列表。在這個數據框列表中,列名將是不同的。但是,在每種情況下,我都想保留第二列df2

我沒有找到任何地方如何通過其編號索引來選擇數據框的列。任何幫助表示讚賞!

編輯:

ANSWER

我想出瞭解決方案。下面是做到這一點的一種方法:

def joinDFs(df1: DataFrame, df2: DataFrame): DataFrame = { 
    val df2cols = df2.columns 
    val desiredDf2Col = df2cols(1) // the second column 
    val df3 = df1.as("df1").join(df2.as("df2"), $"df1.time" === $"df2.time") 
     .select($"df1.*",$"df2.$desiredDf2Col") 
    df3 
} 

,然後我可以dataframes名單上的reduce操作應用此功能。

var listOfDFs: List[DataFrame] = List() 
// Populate listOfDFs as you want here 
val joinedDF = listOfDFs.reduceLeft((x, y) => {joinDFs(x, y)}) 
+0

大膽注意您可以讓您的數據幀的ANL例子嗎? – Psidom

+0

@Psidom:我想出了一個解決方案。請參閱編輯。 – inferno

回答

1

要選擇你的數據框,你可以在第二欄簡單地做:

val df3 = df2.select(df2.columns(1)) 

這將首先查找第二列名稱,然後選擇它。

0

如果你想在reduce功能來定義joinselect方法類似於Joining two DataFrames in Spark SQL and selecting columns of only one
那麼你應該做到以下幾點:

import org.apache.spark.sql.functions._ 
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id").select(Seq(1) map d2.columns map col: _*) 

你必須記住的是,第二列的名稱即Seq(1)不應與任何數據框列名相同。
您可以選擇多列,以及,但記得上面

import org.apache.spark.sql.functions._ 
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id").select(Seq(1, 2) map d2.columns map col: _*) 
相關問題