共用方式為


JSON 檔案

您可以在單行多行模式中讀取 JSON 檔案。 在單行模式中,檔案可以分割成許多部分,並以平行方式讀取。 在多行模式中,檔案會載入為整個實體,而且無法分割。

欲了解更多資訊,請參閱 Apache Spark 關於 JSON 檔案的文件。

選項

如需支援的讀取和寫入選項,請參閱下列 Apache Spark 參考文章。

已獲救的數據列

注意

此功能支援於 Databricks Runtime 8.2(EoL) 及以上版本。

已救援資料欄位確保你在 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 剖析器支援三種模式:PERMISSIVEDROPMALFORMEDFAILFAST。 當與 rescuedDataColumn 搭配使用時,資料類型不匹配不會導致記錄在 DROPMALFORMED 模式中被捨棄,也不會在 FAILFAST 模式中拋出錯誤。 只有已損毀的記錄 (也就是不完整或格式錯誤的 JSON) 才會捨棄或擲回錯誤。 如果你在解析 JSON 時使用這個選項 badRecordsPath ,那麼,使用 rescuedDataColumn 時,資料型別不符合的不會被視為壞紀錄。 只有不完整且格式錯誤的 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 檔案

你可以在 SQL 中使用 read_files 表值函式 來讀取 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 自動偵測

根據預設,系統會自動偵測輸入檔的字元集。 您可以使用 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 檔案筆記本

取得筆記本