如何使用 Spark/Spark SQL 将 JSON blob 展平为数据框

How do I flatten JSON blobs into a Data Frame using Spark/Spark SQL

我想在 Spark-Shell.

中使用 Spark/Spark SQl 将 JSON blob 扁平化为数据框
val df = spark.sql("select body from test limit 3"); // body is a json encoded blob column
val df2 = df.select(df("body").cast(StringType).as("body"))

当我做

df2.show // 显示 3 行

body

------------------------------------

{"k1": "v1", "k2": "v2" }

{"k3": "v3"}

{"k4": "v4", "k5": "v5", "k6": "v6"}

-------------------------------------

现在假设我有十亿个这样的 rows/records,但所有十亿行最多会有 5 个不同的 json 模式。现在如何展平以便获得以下格式的数据框?我应该使用 df.forEach 或 df.forEachPartition 还是 df.explode 或 df.flatMap?我如何确保我没有创建十亿个数据帧并试图合并所有这些数据帧或其他更低效的东西。如果我能看到代码示例,那就太好了。此外,由于这可能有 Nil 我想知道他们是否会占用任何 space?

"K1" | "K2" | "K3" | "K4" | "K5" | "K6"
---------------------------------------
"V1" | "V2" |
            | "V3" |
                   | "V4" | "V5" | "V6"

不确定您使用的是哪个版本的 Spark,但请查看此示例:

Spark SQL JSON

因此,如果您执行以下操作:

import org.apache.spark.sql._
val rdd = df2.rdd.map { case Row(j: String) => j }
spark.read.json(rdd).show()

Spark SQL 将完成繁重的工作。