gpt4 book ai didi

apache-spark - 在 map 列的 Spark 数据框中如何使用所有键的常量更新值

转载 作者:行者123 更新时间:2023-12-04 01:03:00 25 4
gpt4 key购买 nike

我有两列类型为 Integer 和 Map 的 spark 数据框,我想知道更新 map 列的所有键的值的最佳方法。

在 UDF 的帮助下,我能够更新值

def modifyValues = (map_data: Map[String, Int]) => {
val divideWith = 10
map_data.mapValues( _ / divideWith)
}
val modifyMapValues = udf(modifyValues)
df.withColumn("updatedValues", modifyMapValues($"data_map"))


scala> dF.printSchema()
root
|-- id: integer (nullable = true)
|-- data_map: map (nullable = true)
| |-- key: string
| |-- value: integer (valueContainsNull = true)

样本数据:
>val ds = Seq(
(1, Map("foo" -> 100, "bar" -> 200)),
(2, Map("foo" -> 200)),
(3, Map("bar" -> 200))
).toDF("id", "data_map")

Expected output:
+---+-----------------------+
|id |data_map |
+---+-----------------------+
|1 |[foo -> 10, bar -> 20] |
|2 |[foo -> 20] |
|3 |[bar -> 1] |
+---+-----------------------+

想知道,有没有办法在没有 UDF 的情况下做到这一点?

最佳答案

一种可能的方法(没有UDF)是这样的:

  • 使用 map_keys 将键提取到数组
  • 使用 map_values 将值提取到数组
  • 使用 TRANSFORM 转换提取的值(自 Spark 2.4 起可用)
  • 使用 map_from_arrays
  • 创建回 map
    import org.apache.spark.sql.functions.{expr, map_from_arrays, map_values, map_keys}

    ds
    .withColumn("values", map_values($"data_map"))
    .withColumn("keys", map_keys($"data_map"))
    .withColumn("values_transformed", expr("TRANSFORM(values, v -> v/10)"))
    .withColumn("data_map_transformed", map_from_arrays($"keys", $"values_transformed"))

    关于apache-spark - 在 map 列的 Spark 数据框中如何使用所有键的常量更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57803864/

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