使用 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|
// +---+---+---+---+
我正在尝试根据另一个数据框重命名数据框的列。我如何使用 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 尝试了代码(从
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|
// +---+---+---+---+