JSON 檔案
您可以在單行或多行模式中讀取 JSON 檔案。 在單行模式中,檔案可以分割成許多部分,並以平行方式讀取。 在多行模式中,檔案會載入為整個實體,而且無法分割。
如需進一步資訊,請參閱 JSON 檔案。
選項。
如需支援的讀取和寫入選項,請參閱下列 Apache Spark 參考文章。
已獲救的數據 column
注意
Databricks Runtime 8.2 (EoS) 和更新版本支援此功能。
已獲救的數據 column 可確保您在 ETL 期間永遠不會遺失或錯過數據。 復原的數據 column 包含任何未剖析的數據,原因可能是因為指定的 schema中遺漏,或是類型不符,或是記錄或檔案中的 column 大小寫與 schema中的數據不相符。 已獲救的數據 column 會以 JSON Blob 的形式傳回,其中包含已獲救的 columns,以及記錄的來源檔案路徑。 若要從已救回的數據 column中取得來源檔案路徑 remove,您可以 set SQL 設定 spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")
。 您可以透過將選項 rescuedDataColumn
設定為 column 名稱來啟用已獲救的數據 column,例如 _rescued_data
搭配 spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load(<path>)
。
剖析記錄時,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 會自動推斷 schema。
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 自動偵測
根據預設,系統會自動偵測輸入檔的字元集。 您可以使用 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 所支援字元集的完整 list,請參閱 支援的編碼方式。
筆記本範例:讀取 JSON 檔案
下列筆記本示範單行模式和多行模式。