JSON 文件
可在单行或多行模式下读取 JSON 文件。 在单行模式下,可将一个文件拆分成多个部分进行并行读取。 在多行模式下,文件将作为一个整体实体加载且无法拆分。
有关详细信息,请参阅 JSON 文件。
选项
有关支持的读取和写入选项,请参阅以下 Apache Spark 参考文章。
补救数据列
注意
此功能在 Databricks Runtime 8.2 (EoS) 及更高版本中受支持。
补救数据列可确保在 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 分析器支持三种模式:PERMISSIVE
、DROPMALFORMED
和 FAILFAST
。 与 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-8
、UTF-16BE
、UTF-16LE
、UTF-16
、UTF-32BE
、UTF-32LE
、UTF-32
。 若要查看 Oracle Java SE 支持的字符集的完整列表,请参阅受支持的编码。
笔记本示例:读取 JSON 文件
以下笔记本演示单行模式和多行模式。