将 Seq[Column] 附加到现有 Spark 数据帧 Scala

Append Seq[Column] to existing Spark dataframe Scala

提问人:Arvinth kumar 提问时间:7/15/2023 最后编辑:Zach KingArvinth kumar 更新时间:7/16/2023 访问量:183

问:

我有 Spark Dataframe 和 Seq[Column] 。我正在尝试将 Seq[Column] 中的列附加到现有 Dataframe。Seq[Column] 将有多个列。df_dataMetrics

我能够将单列附加到 Dataframe。但无法继续 Seq[Column]

  val new_df = Metrics.foldLeft(df_data)((df_data, newColumn: (Column)) =>
              df_data.withColumn("column_name", newColumn))

我在 Seq 中工作不多。 需要帮助

DataFrame Scala Apache-Spark 序列

评论


答:

2赞 Zach King 7/15/2023 #1

由于您在每次追加列时都对列名进行了硬编码,因此它会以名称“column_name”覆盖以前添加的列.withColumn("column_name", newColumn)

如果您使用映射(如果您希望保持排序,则使用元组的 Seq)来同时定义列名及其值。

val Metrics = Map("c1" -> lit("one"), "c2" -> lit("two"))

val new_df = Metrics.foldLeft(df_data) { 
  case (df, (colName, colVal)) => 
    df.withColumn(colName, colVal) 
}

new_df.show()

原始数据帧 :df_data

+---+---+
|  x| x2|
+---+---+
|  0|  0|
|  1|  2|
|  2|  4|
|  3|  6|
|  4|  8|
+---+---+

新数据帧:new_df

+---+---+---+---+
|  x| x2| c1| c2|
+---+---+---+---+
|  0|  0|one|two|
|  1|  2|one|two|
|  2|  4|one|two|
|  3|  6|one|two|
|  4|  8|one|two|
+---+---+---+---+
1赞 Chris 7/16/2023 #2

用:

import org.apache.spark.sql.functions.expr
val new_df = df_data.select((expr("*") +: Metrics) :_*)

如果需要括号等,将取决于 Spark/Scala 版本。值得避免在折叠/循环中with_column,因为创建的投影并不总是经过优化。

评论

0赞 Srinivas 7/16/2023
我相信如果 DataFrame 中没有列,此逻辑将失败。
2赞 Srinivas 7/16/2023 #3

如果有,则可以使用函数将列追加到现有的 spark DataFrame。Map(columnName -> columnValue)withColumns

scala> val df = Seq("Srinivas").toDF("firstName")
df: org.apache.spark.sql.DataFrame = [firstName: string]

scala> df.printSchema
root
 |-- firstName: string (nullable = true)


scala> val newColumns = Map("lastName" -> lit("Reddy"), "age" -> lit(30))
newColumns: scala.collection.immutable.Map[String,org.apache.spark.sql.Column] = Map(lastName -> Reddy, age -> 30)

scala> df.withColumns(newColumns).printSchema
root
 |-- firstName: string (nullable = true)
 |-- lastName: string (nullable = false)
 |-- age: integer (nullable = false)


scala> df.show(false)
+---------+
|firstName|
+---------+
|Srinivas |
+---------+


scala> df.withColumns(newColumns).show(false)
+---------+--------+---+
|firstName|lastName|age|
+---------+--------+---+
|Srinivas |Reddy   |30 |
+---------+--------+---+