如何在Scala中连接两个数据帧并从数据框中的几列中选择它们的索引?

时间:2017-05-09 00:31:40

标签: scala apache-spark dataframe

我必须加入两个数据帧,这与此处给出的任务非常相似Joining two DataFrames in Spark SQL and selecting columns of only one

但是,我只想从df2中选择第二列。在我的任务中,我将对reduce函数中的两个数据帧使用join函数来获取数据帧列表。在此数据框列表中,列名称将不同。但是,在每种情况下,我都希望保留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
}

然后我可以在数据帧列表的reduce操作中应用此函数。

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

2 个答案:

答案 0 :(得分:1)

要选择数据框中的第二列,您只需执行以下操作:

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

这将首先找到第二列名称,然后选择它。

答案 1 :(得分:0)

如果您要在join功能中定义的selectreduce方法与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: _*)