我有一个multiLine json文件,我使用spark的read.json来读取json,问题是它只是从那个json文件中读取第一个对象
val dataFrame = spark.read.option("multiLine", true).option("mode", "PERMISSIVE").json(path)
dataFrame.rdd.saveAsTextFile("DataFrame")
示例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
}
我只获得id = 589895e123c572923e69f5e7
的第一个条目。
有什么我做错了吗?
答案 0 :(得分:1)
您确定支持多个多行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
答案 1 :(得分:0)
在文件中保留一行和一个JsValue,删除.option("multiLine", true)
。
像这样:
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}