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。
有什么我做错了吗?
你确定多个多线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 将被使用
| 归档时间: |
|
| 查看次数: |
2945 次 |
| 最近记录: |