提问人:Arvinth kumar 提问时间:7/15/2023 最后编辑:Zach KingArvinth kumar 更新时间:7/16/2023 访问量:183
将 Seq[Column] 附加到现有 Spark 数据帧 Scala
Append Seq[Column] to existing Spark dataframe Scala
问:
我有 Spark Dataframe 和 Seq[Column] 。我正在尝试将 Seq[Column] 中的列附加到现有 Dataframe。Seq[Column] 将有多个列。df_data
Metrics
我能够将单列附加到 Dataframe。但无法继续 Seq[Column]
val new_df = Metrics.foldLeft(df_data)((df_data, newColumn: (Column)) =>
df_data.withColumn("column_name", newColumn))
我在 Seq 中工作不多。 需要帮助
答:
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 |
+---------+--------+---+
下一个:R 每 n 行删除几行
评论