read.json 只读取 Spark 中的第一个对象

ata*_*pha 3 json scala apache-spark

我有一个 multiLine json 文件,我使用 spark 的 read.json 来读取 json,问题是它只从那个 json 文件中读取第一个对象

val dataFrame = spark.read.option("multiLine", true).option("mode", "PERMISSIVE").json(path)
dataFrame.rdd.saveAsTextFile("DataFrame")
Run Code Online (Sandbox Code Playgroud)

示例json:

{
    "_id" : "589895e123c572923e69f5e7",
    "thing" : "54eb45beb5f1e061454c5bf4",
    "timeline" : [ 
        {
            "reason" : "TRIP_START",
            "timestamp" : "2017-02-06T17:20:18.007+02:00",
            "type" : "TRIP_EVENT",
            "location" : [ 
                11.1174091, 
                69.1174091
            ],
            "endLocation" : [],
            "startLocation" : []
        }, 
            "reason" : "TRIP_END",
            "timestamp" : "2017-02-06T17:25:26.026+02:00",
            "type" : "TRIP_EVENT",
            "location" : [ 
                11.5691428, 
                48.1122443
            ],
            "endLocation" : [],
            "startLocation" : []
        }
    ],
    "__v" : 0
}
{
    "_id" : "589895e123c572923e69f5e8",
    "thing" : "54eb45beb5f1e032241c5bf4",
    "timeline" : [ 
        {
            "reason" : "TRIP_START",
            "timestamp" : "2017-02-06T17:20:18.007+02:00",
            "type" : "TRIP_EVENT",
            "location" : [ 
                11.1174091, 
                50.1174091
            ],
            "endLocation" : [],
            "startLocation" : []
        }, 
            "reason" : "TRIP_END",
            "timestamp" : "2017-02-06T17:25:26.026+02:00",
            "type" : "TRIP_EVENT",
            "location" : [ 
                51.1174091, 
                69.1174091
            ],
            "endLocation" : [],
            "startLocation" : []
        }
    ],
    "__v" : 0
}
Run Code Online (Sandbox Code Playgroud)

我只得到 id = 的第一个条目589895e123c572923e69f5e7

有什么我做错了吗?

cri*_*007 5

你确定多个多线JSON支持?

每行必须包含一个单独的、自包含的有效 JSON 对象...对于常规的多行 JSON 文件,将 multiLine 选项设置为 true

http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets

“常规 JSON 文件”意味着整个文件是一个单一的 JSON 对象/数组,但是,简单地放置{}数据是行不通的,因为每个对象都需要一个密钥,因此您需要一个顶级密钥,也许说"objects"。同样,您可以尝试使用数组,但使用[]. 无论哪种方式,只有当该数组或对象中的每个对象都用逗号分隔时,这些才会起作用。

tl;dr - 整个文件必须是一个有效的 JSON 对象

你只得到一个对象,因为它解析了第一组括号,就是这样。

如果您可以完全控制 JSON 文件,缩进布局纯粹是供人使用的。只需将对象展平并让 Spark 解析它,因为 API 将被使用

  • 我用逗号分隔 JSON 中的所有对象并包裹在 [] 中。它创建了一个 JSON 对象数组,我成功地从中创建了一个 RDD。非常感谢。@cricket_007 你能发布这个吗,我会接受你的答案,这是你将它包裹在括号内的解决方案,我只是注意到用逗号分隔对象以使其成为 JSON 对象列表。非常感谢。 (3认同)
  • @ata 如果你想像这样使用多个对象,顶级对象需要是一个包含所有对象的数组 (2认同)