![](/img/trans.png)
[英]Dataframes Join in Scala with multiple columns is not same with few columns might be null
[英]How to join two dataframes in Scala and select on few columns from the dataframes by their index?
我必須連接兩個數據框,這與此處給出的任務非常相似。 在Spark SQL中連接兩個數據框並選擇僅一個的列
但是,我只想從df2
選擇第二列。 在我的任務中,我將對一個數據幀列表的reduce
函數使用join函數用於兩個數據幀。 在此數據幀列表中,列名將不同。 但是,在每種情況下,我都希望保留df2
的第二列。
我沒有找到任何地方如何通過其編號索引選擇數據框的列。 任何幫助表示贊賞!
編輯:
回答
我想出了解決方案。 這是執行此操作的一種方法:
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
}
然后,我可以在應用此功能reduce
dataframes列表上的操作。
var listOfDFs: List[DataFrame] = List()
// Populate listOfDFs as you want here
val joinedDF = listOfDFs.reduceLeft((x, y) => {joinDFs(x, y)})
要選擇數據框中的第二列,您只需執行以下操作:
val df3 = df2.select(df2.columns(1))
這將首先找到第二列名稱,然后選擇它。
如果要在reduce
函數中定義的join
和select
方法類似於在Spark SQL中聯接兩個DataFrame並選擇僅一個的列
然后,您應該執行以下操作:
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: _*)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.