首页 > 解决方案 > 即使将多行选项设置为 true,Spark 也不会在单个文件中加载所有多行 json 对象

问题描述

我的 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

标签: apache-sparkapache-spark-sql

解决方案


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

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

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

Spark 无需设置multiline选项即可读取此 JSON:

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

输出 :

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

推荐阅读