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

时间:2017-11-23 15:04:40

标签: 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")

示例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的第一个条目。

有什么我做错了吗?

2 个答案:

答案 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}

enter image description here