gpt4 book ai didi

java - 使用大量列在 Scala 中转换数据框行

转载 作者:行者123 更新时间:2023-11-30 06:41:51 24 4
gpt4 key购买 nike

我想更改数据帧 df 一行中多个字段的值。通常,我会使用 map 进行行到行的转换。像这样的东西:

+---+---------+
|num|name |
+---+---------+
| 1|Hydrogen |
| 2|Helium |
+---+---------+
df.map(row=>{
val name = row.getAs("name").toString.toUpperCase
(row(0),name)
})

但现在我有一个数据框,它有很多列的非常精细的模式,我只想更改其中一些列的值。一列值的变化取决于其他列。我怎样才能避免在元组中写入所有列值(如 row.get(0), row.get(1) ... row.get(30)),而只写入那些已改变?考虑具有此架构的 df:

case class DFSchema(id: String, name: String, map1: Map[String, String], ... , map30[Sting, String])

我想更新 df.select("map30") 的键和值,并且仅当 id 是时才修改 "name" “城市”。当然,在其他列中还有更多这样的转换(在模式中表示为 mapX

我没有考虑使用 UDF 来解决这个问题,因为即使 UDF 返回一个包含许多列的结构,我也不知道如何使用 withColumn() 更改多个列,因为它只接受“一个"列名称。但是,使用 UDF 的解决方案与在行上使用 .map 一样受欢迎。

最佳答案

你可以尝试这样的事情:

val rules = Seq(
"columnA" -> lit(20),
"columnB" -> col("columnB").plus(col("columnC")),
"columnC" -> col("columnC").minus(col("columnD")),
"columnN" -> col("columnA").plus(col("columnB")).plus(col("columnC"))
)

def (inputDf: DataFrame): DataFrame = {
rules.foldLeft(inputDf) {
case (df, (columnName, ruleColumn)) => df.withColumn(columnName, ruleColumn)
}
}

这里我们有 rules,它是一对序列,其中第一个值是我们要更改/添加的目标列的名称,第二个是应使用依赖项应用的规则列。

使用 foldLeft 操作,我们将所有规则应用于输入 DataFrame

关于java - 使用大量列在 Scala 中转换数据框行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54583443/

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