【问题标题】:Reading JSON Array with Apache Spark使用 Apache Spark 读取 JSON 数组
【发布时间】:2021-06-22 02:30:52
【问题描述】:

我有一个 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 读取它?

【问题讨论】:

    标签: json scala apache-spark


    【解决方案1】:

    是的,原因是文本和实际 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\"}]}"}
    

    【讨论】:

    • 实际上我们无法更改架构,它会是一样的。我们不能通过 Spark UDF 来实现吗?
    • 好吧,你需要一些东西来加载它,唯一的解决方案是使用 spark.read.text() 而不是 json,而不是尝试解析它。
    • 但是多个事件的数据看起来如何?它总是事件而不是元数据?所以像 [event1, meta1, event2, meta2, ....]
    猜你喜欢
    • 2016-12-18
    • 2017-03-05
    • 2017-03-28
    • 2016-11-27
    • 1970-01-01
    • 2021-05-27
    • 2020-07-13
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多