gpt4 book ai didi

apache-spark - Spark DataFrame 以键为成员分解 map

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

我在 databrick's blog 找到了一个 map 爆炸示例:

// input
{
"a": {
"b": 1,
"c": 2
}
}

Python: events.select(explode("a").alias("x", "y"))
Scala: events.select(explode('a) as Seq("x", "y"))
SQL: select explode(a) as (x, y) from events

// output
[{ "x": "b", "y": 1 }, { "x": "c", "y": 2 }]

但是,我看不出有什么方法可以让我将 map 更改为一个数组,该数组中的键被展平,然后爆炸:
// input
{
"id": 0,
"a": {
"b": {"d": 1, "e": 2}
"c": {"d": 3, "e": 4}
}
}
// Schema
struct<id:bigint,a:map<string,struct<d:bigint,e:bigint>>>
root
|-- id: long (nullable = true)
|-- a: map (nullable = true)
| |-- key: string
| |-- value: struct (valueContainsNull = true)
| | |-- d: long (nullable = true)
| | |-- e: long (nullable = true)


// Imagined proces
Python: …
Scala: events.select('id, explode('a) as Seq("x", "*")) //? "*" ?
SQL: …

// Desired output
[{ "id": 0, "x": "b", "d": 1, "e": 2 }, { "id": 0, "x": "c", "d": 3, "e": 4 }]

是否有一些明显的方法可以采用这样的输入来制作一个表格,例如:
id | x | d | e
---|---|---|---
0 | b | 1 | 2
0 | c | 3 | 4

最佳答案

虽然不知道一个人能不能爆 map explode ,有一种方法可以使用 UDF。诀窍是使用 Row#schema.fields(i).name获取“ key ”的名称

def mapStructs = udf((r: Row) => {
r.schema.fields.map(f => (
f.name,
r.getAs[Row](f.name).getAs[Long]("d"),
r.getAs[Row](f.name).getAs[Long]("e"))
)
})

df
.withColumn("udfResult", explode(mapStructs($"a")))
.withColumn("x", $"udfResult._1")
.withColumn("d", $"udfResult._2")
.withColumn("e", $"udfResult._3")
.drop($"udfResult")
.drop($"a")
.show


+---+---+---+---+
| id| x| d| e|
+---+---+---+---+
| 0| b| 1| 2|
| 0| c| 3| 4|
+---+---+---+---+

关于apache-spark - Spark DataFrame 以键为成员分解 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192994/

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