Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
可在单行或多行模式下读取 JSON 文件。 在单行模式下,可将一个文件拆分成多个部分进行并行读取。 在多行模式下,文件将作为一个整体实体加载且无法拆分。
有关详细信息,请参阅 有关 JSON 文件的 Apache Spark 文档。
选项
有关支持的读取和写入选项,请参阅以下 Apache Spark 参考文章。
恢复数据列
注意
Databricks Runtime 8.2 及更高版本中支持此功能。
已获救的数据列可确保在 ETL 期间永远不会丢失数据。 已获救的数据列包含未分析的任何数据,要么是因为给定架构中缺少数据,要么是因为类型不匹配,或者记录或文件中的列的大小写与架构中不匹配。 已获救的数据列作为 JSON Blob 返回,其中包含已获救列和记录的源文件路径。 若要从已获救的数据列中删除源文件路径,请设置 SQL 配置 spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")。 若要启用已获救的数据列,请将选项 rescuedDataColumn 设置为列名称,例如 _rescued_data,使用 spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load(<path>)。
分析记录时,JSON 分析器支持三种模式:PERMISSIVE、DROPMALFORMED 和 FAILFAST。 与 rescuedDataColumn 一起使用时,数据类型不匹配不会导致在 DROPMALFORMED 模式下删除记录,或者在 FAILFAST 模式下引发错误。 只有损坏的记录(即不完整或格式错误的 JSON)会被删除或引发错误。 如果在分析 JSON 时使用此选项 badRecordsPath ,则在使用 rescuedDataColumnJSON 时,数据类型不匹配不会被视为错误的记录。 只有不完整的和格式错误的 JSON 记录才会存储在 badRecordsPath 中。
示例
以下示例演示如何使用 DataFrame API 和 SQL 读取和写入 JSON 文件。
单行模式
每行都包含一个 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 数据,请使用:
Python
df = spark.read.format("json").load("example.json")
df.printSchema()
Scala(编程语言)
val df = spark.read.format("json").load("example.json")
df.printSchema
Spark 自动推断架构:
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"
}
}
]
若要读取此对象,请启用多行模式:
Python
mdf = spark.read.option("multiline", "true").format("json").load("/tmp/multi-line.json")
mdf.show(truncate=False)
Scala(编程语言)
val mdf = spark.read.option("multiline", "true").format("json").load("/tmp/multi-line.json")
mdf.show(false)
SQL
CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/tmp/multi-line.json",multiline=true)
使用 SQL 读取 JSON 文件
可以使用 read_files SQL 中的表值函数 表值函数读取 JSON 文件。
SELECT * FROM read_files(
'<path to json file or folder>',
format => 'json',
multiLine => true)
还可以使用 USING JSON 读取 JSON 文件。 但是,Databricks 建议使用 read_files ,而不是 USING JSON 因为 read_files 允许规范架构和其他文件处理选项。
DROP TABLE IF EXISTS json_data;
CREATE TABLE json_data
USING JSON
OPTIONS (path "/path/to/file.json", multiline true);
SELECT * FROM json_data;
字符集自动检测
默认情况下,会自动检测输入文件的字符集。 可以使用 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 支持的字符集的完整列表,请参阅 Supported Encodings。
笔记本示例:读取 JSON 文件
以下记事本演示单行模式和多行模式。