gpt4 book ai didi

json - 优雅的 Json 在 Spark 中展平

转载 作者:行者123 更新时间:2023-12-04 06:34:09 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to flatten a struct in a Spark dataframe?

(12 个回答)


9 个月前关闭。




我在 spark 中有以下数据框:

val test = sqlContext.read.json(path = "/path/to/jsonfiles/*")  
test.printSchema
root
|-- properties: struct (nullable = true)
| |-- prop_1: string (nullable = true)
| |-- prop_2: string (nullable = true)
| |-- prop_3: boolean (nullable = true)
| |-- prop_4: long (nullable = true)
...

我想要做的是展平这个数据框,以便 prop_1 ... prop_n存在于顶层。 IE。
test.printSchema
root
|-- prop_1: string (nullable = true)
|-- prop_2: string (nullable = true)
|-- prop_3: boolean (nullable = true)
|-- prop_4: long (nullable = true)
...

有几种解决类似问题的方法。我能找到的最好的是摆姿势 here .但是,解决方案仅适用于 properties类型为 Array .就我而言,属性的类型是 StructType .

另一种方法是:
test.registerTempTable("test")
val test2 = sqlContext.sql("""SELECT properties.prop_1, ... FROM test""")

但在这种情况下,我必须明确指定每一行,这是不雅的。

解决这个问题的最佳方法是什么?

最佳答案

如果您不是在寻找递归解决方案,那么在 1.6+ 点语法中使用 star 应该可以正常工作:

val df = sqlContext.read.json(sc.parallelize(Seq(
"""{"properties": {
"prop1": "foo", "prop2": "bar", "prop3": true, "prop4": 1}}"""
)))

df.select($"properties.*").printSchema
// root
// |-- prop1: string (nullable = true)
// |-- prop2: string (nullable = true)
// |-- prop3: boolean (nullable = true)
// |-- prop4: long (nullable = true)

不幸的是,这在 1.5 及更早版本中不起作用。

在这种情况下,您可以简单地直接从架构中提取所需的信息。您会在 Dropping a nested column from Spark DataFrame 中找到一个示例这应该很容易调整以适应这种情况和另一种情况(Python 中的递归模式展平) Pyspark: Map a SchemaRDD into a SchemaRDD .

关于json - 优雅的 Json 在 Spark 中展平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35027966/

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