簡體   English   中英

如何在Scala中聯接兩個數據框並按其索引從數據框中選擇幾列?

[英]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函數中定義的joinselect方法類似於在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM