Spark 不会在单个文件中加载所有多行 json 对象,即使多行选项设置为 true



我的json文件如下所示,它有两个多行json对象(在一个文件中(

{
"name":"John Doe",
"id":"123456"
}
{
"name":"Jane Doe",
"id":"456789"
}

因此,当我加载多行 json 数据帧时,它应该加载两个 json,而不是仅加载第一个 json 对象。如何在单个文件中加载所有多行 json 对象?

val rawData = spark.read.option("multiline", true).option("mode", "PERMISSIVE").format("json").load("/tmp/search/baggage/test/1")
scala> rawData.show
+------+--------+
|    id|    name|
+------+--------+
|123456|John Doe|
+------+--------+
scala> rawData.count
res20: Long = 1

您的输入 JSON 无效,它会缺少括号,因为您有多个对象。您可以使用任何 json 验证器工具进行检查。这就是为什么multiLine选项在这种情况下不起作用的原因。

也就是说,我认为您希望使用JsonLines格式,其中每行代表一个JSON对象。

{"name":"John Doe","id":"123456"}
{"name":"Jane Doe","id":"456789"}

Spark 可以在不设置选项的情况下读取此 JSONmultiline

val df = spark.read.json("file:///your/json/file.json")
df.show()

输出:

+------+--------+
|    id|    name|
+------+--------+
|123456|John Doe|
|456789|Jane Doe|
+------+--------+

输入 Json 不是有效的 json,有效的 JSON 如下所示:

[{
"name":"John Doe",
"id":"123456"
},
{
"name":"Jane Doe",
"id":"456789"
}]

从上面的 json 创建数据帧将创建一个正确的数据帧。

>>> df = spark.createDataFrame(j, ["id", "name"])
>>> df.show()
+------+--------+
|    id|    name|
+------+--------+
|123456|John Doe|
|456789|Jane Doe|
+------+--------+

最新更新