gpt4 book ai didi

scala - 将多列附加到 Spark 中的现有数据框

转载 作者:行者123 更新时间:2023-12-04 19:57:09 27 4
gpt4 key购买 nike

我需要将多列附加到现有的 spark 数据框中,其中列名在 List 中给出
假设新列的值是恒定的,例如给定的输入列和数据框是

val columnsNames=List("col1","col2")
val data = Seq(("one", 1), ("two", 2), ("three", 3), ("four", 4))

在附加两列之后,假设 col1 的常量值为“val1”,col2 的值为“val2”,输出数据帧应该是
+-----+---+-------+------+
| _1| _2|col1 |col2|
+-----+---+-------+------+
| one| 1|val1 |val2|
| two| 2|val1 |val2|
|three| 3|val1 |val2|
| four| 4|val1 |val2|
+-----+---+-------+------+

我写了一个函数来追加列
def appendColumns (cols: List[String], ds: DataFrame): DataFrame = {

cols match {

case Nil => ds
case h :: Nil => appendColumns(Nil, ds.withColumn(h, lit(h)))
case h :: tail => appendColumns(tail, ds.withColumn(h, lit(h)))

}
}

有没有更好的方法和更实用的方法来做到这一点。

谢谢

最佳答案

是的,有更好更简单的方法。基本上,您调用 withColumn 的次数一样多。因为你有列。有很多列,催化剂,优化 Spark 查询的引擎可能会感觉有点不知所措(我过去有过类似用例的经验)。我什至看到它在尝试数千列时会导致驱动程序出现 OOM。为了避免给催化剂带来压力(并编写更少的代码;-)),您可以简单地使用 select像下面这样在一个 spark 命令中完成此操作:

val data = Seq(("one", 1), ("two", 2), ("three", 3), ("four", 4)).toDF
// let's assume that we have a map that associates column names to their values
val columnMap = Map("col1" -> "val1", "col2" -> "val2")
// Let's create the new columns from the map
val newCols = columnMap.keys.map(k => lit(columnMap(k)) as k)
// selecting the old columns + the new ones
data.select(data.columns.map(col) ++ newCols : _*).show
+-----+---+----+----+
| _1| _2|col1|col2|
+-----+---+----+----+
| one| 1|val1|val2|
| two| 2|val1|val2|
|three| 3|val1|val2|
| four| 4|val1|val2|
+-----+---+----+----+

关于scala - 将多列附加到 Spark 中的现有数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55586063/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com