如何在 Scala 中连接两个数据帧并通过索引从数据帧中选择几列?

Posted

技术标签:

【中文标题】如何在 Scala 中连接两个数据帧并通过索引从数据帧中选择几列?【英文标题】:How to join two dataframes in Scala and select on few columns from the dataframes by their index? 【发布时间】:2017-05-09 00:31:39 【问题描述】:

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

但是,我只想从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 操作中应用此函数。

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

【问题讨论】:

你能举一个你的数据框的例子吗? @Psidom:我想出了一个解决方案。请查看编辑。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

如果您要在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: _*)

【讨论】:

以上是关于如何在 Scala 中连接两个数据帧并通过索引从数据帧中选择几列?的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:内部连接两个 pyspark 数据帧并从第一个数据帧中选择所有列,从第二个数据帧中选择几列

我应该如何在 Pandas 中减去两个数据帧并显示所需的输出?

如何在行级别上比较两个海量 Spark 数据帧并打印差异

如何比较两个熊猫数据框并返回将它们相互映射的索引?

如果匹配,如何合并两个数据帧并从新列中的另一列返回数据?

如何通过比较火花中相同列的两个数据帧来计算列值的数量