使用 scala 相对于另一个数据框重命名数据框的列名

Rename column names of a dataframe with respect to another dataframe using scala

我正在尝试根据另一个数据框重命名数据框的列。我如何使用 Scala 实现此目的?

基本上我的数据看起来像

DataFrame1

A    B    C   D
1    2    3   4

我有另一个 table 看起来像这个 DataFrame2

Col1    Col2
A       E
B       Q
C       R
D       Z

我想根据其他数据框重命名我的第一个数据框的列。这样预期的输出应该是这样的:

E    Q    R    Z
1    2    3    4

我已经使用 PySpark 尝试了代码(从 by user8371915 复制)并且工作正常:

name_dict = dataframe2.rdd.collectAsMap()

dataframe1.select([dataframe[c].alias(name_dict.get(c, c)) for c in dataframe1.columns]).show()

现在,我如何使用 Scala 实现此目的?

根据需要使用 spark 1.6

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.col

object ColumnNameChange {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession
      .builder()
      .appName("SparkSessionExample")
      .config("spark.master", "local")
      .getOrCreate()

    import spark.implicits._

    val df1 = Seq((1, 2, 3, 4)).toDF("A","B","C","D")
    val df2 = Seq(("A", "E"),("B","Q"), ("C", "R"),("D","Z")).toDF("Col1","Col2")


    val name_dict : scala.collection.Map[String,String] = df2.map(row => { row.getAs[String]("Col1") -> row.getAs[String]("Col2") }).collectAsMap()

    val df3 = df1.select(df1.columns.map(c => col(c).as(name_dict.getOrElse(c, c))): _*)
    df3.show()


  }

}

你也可以这样做(df1 和 df2 与 @AnuragSharma 中的相同):

val spark: SparkSession = ???
import spark.implicits._

val to  = df1.columns.toSeq.toDF.join(df2, $"value" === df2("Col1"))
  .select("Col2")
  .collect.map(row => (row.getString(0))).toList

val newDF = df1.toDF(to: _*)

newDF.show()

// +---+---+---+---+
// |  E|  Q|  R|  Z|
// +---+---+---+---+
// |  1|  2|  3|  4|
// +---+---+---+---+