JSON 文件

可在单行多行模式下读取 JSON 文件。 在单行模式下,可将一个文件拆分成多个部分进行并行读取。 在多行模式下,文件将作为一个整体实体加载且无法拆分。

有关详细信息,请参阅 JSON 文件

选项

有关支持的读取和写入选项,请参阅以下 Apache Spark 参考文章。

补救数据列

注意

Databricks Runtime 8.2(不受支持)及更高版本支持此功能。

补救数据列可确保在 ETL 期间不会丢失或错过数据。 补救数据列包含由于在给定架构中缺失、类型不匹配或者记录或文件中列的大小写与架构中不匹配而未分析的任何数据。 补救数据列以 JSON blob 形式返回,其中包含补救的列和记录的源文件路径。 若要从补救的数据列中删除源文件路径,可以设置 SQL 配置 spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")。 你可以通过将选项 rescuedDataColumn 设置为某个列名来启用补救的数据列,例如,spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load(<path>)_rescued_data

分析记录时,JSON 分析器支持三种模式:PERMISSIVEDROPMALFORMEDFAILFAST。 与 rescuedDataColumn 一起使用时,数据类型不匹配不会导致在 DROPMALFORMED 模式下删除记录,或者在 FAILFAST 模式下引发错误。 只有损坏的记录(即不完整或格式错误的 JSON)会被删除或引发错误。 如果在分析 JSON 时使用选项 badRecordsPath,则不会在使用 rescuedDataColumn 时将数据类型不匹配情况视为错误记录。 只有不完整的和格式错误的 JSON 记录才会存储在 badRecordsPath 中。

示例

单行模式

在此示例中,每行有一个 JSON 对象:

{"string":"string1","int":1,"array":[1,2,3],"dict": {"key": "value1"}}
{"string":"string2","int":2,"array":[2,4,6],"dict": {"key": "value2"}}
{"string":"string3","int":3,"array":[3,6,9],"dict": {"key": "value3", "extra_key": "extra_value3"}}

若要读取 JSON 数据,请使用:

val df = spark.read.format("json").load("example.json")

Spark 会自动推断架构。

df.printSchema
root
 |-- array: array (nullable = true)
 |    |-- element: long (containsNull = true)
 |-- dict: struct (nullable = true)
 |    |-- extra_key: string (nullable = true)
 |    |-- key: string (nullable = true)
 |-- int: long (nullable = true)
 |-- string: string (nullable = true)

多行模式

此 JSON 对象占据多行:

[
  {"string":"string1","int":1,"array":[1,2,3],"dict": {"key": "value1"}},
  {"string":"string2","int":2,"array":[2,4,6],"dict": {"key": "value2"}},
  {
    "string": "string3",
    "int": 3,
    "array": [
        3,
        6,
        9
    ],
    "dict": {
        "key": "value3",
        "extra_key": "extra_value3"
    }
  }
]

若要读取此对象,请启用多行模式:

SQL

CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/tmp/multi-line.json",multiline=true)

Scala

val mdf = spark.read.option("multiline", "true").format("json").load("/tmp/multi-line.json")
mdf.show(false)

字符集自动检测

默认情况下,会自动检测输入文件的字符集。 可以使用 charset 选项显式指定字符集:

spark.read.option("charset", "UTF-16BE").format("json").load("fileInUTF16.json")

下面是一些受支持的字符集:UTF-8UTF-16BEUTF-16LEUTF-16UTF-32BEUTF-32LEUTF-32。 若要查看 Oracle Java SE 支持的字符集的完整列表,请参阅受支持的编码

笔记本示例:读取 JSON 文件

以下笔记本演示单行模式和多行模式。

读取 JSON 文件笔记本

获取笔记本