首页 > 解决方案 > 使用 Apache Spark 读取 JSON 数组

问题描述

我有一个 json 数组文件,如下所示:

["{\"timestamp\":1616549396892,\"id\":\"1\",\"events\":[{\"event_type\":\"ON\"}]}",{"meta":{"headers":{"app":"music"},"customerId":"2"}}]

我有一个 json 文件,节点如下所示:

我正在尝试通过 spark-shell 在 scala 中读取此文件。

val s1 = spark.read.json("path/to/file/file.json")

但是,这会导致损坏记录错误:

org.apache.spark.sql.DataFrame = [_corrupt_record: string]

我也试过这样读:

val df = spark.read.json(spark.sparkContext.wholeTextFiles("path.json").values)
val df = spark.read.option("multiline", "true").json("<file>")

但仍然是同样的错误。

由于 json 数组包含字符串,而 json 对象可能就是我无法读取它的原因。

任何人都可以阐明这个错误吗?我们如何通过 spark udf 读取它?

标签: jsonscalaapache-spark

解决方案


是的,原因是文本和实际 json 对象的混合。在我看来,这两个条目好像属于一起,所以为什么不将架构更改为这样的:

{"meta":{"headers": {"app": "music"},"customerId": "2"},"data": "{\"timestamp\":1616549396892,\"id\":\"1\",\"events\":[{\"event_type\":\"ON\"}]}"}

新行也意味着新记录,因此对于多个事件,您的文件将如下所示:

{"meta":{"headers": {"app": "music"},"customerId": "2"},"data": "{\"timestamp\":1616549396892,\"id\":\"1\",\"events\":[{\"event_type\":\"ON\"}]}"}
{"meta":{"headers": {"app": "music"},"customerId": "2"},"data": "{\"timestamp\":1616549396892,\"id\":\"2\",\"events\":[{\"event_type\":\"ON\"}]}"}

推荐阅读