単一行モードまたは複数行モードで JSON ファイルを読み取ることができます。 単一行モードでは、ファイルを複数の部分に分割して並列して読み取ることができます。 複数行モードでは、ファイルはエンティティ全体として読み込まれ、分割することはできません。
詳細については、 JSON Files に関する Apache Spark のドキュメントを参照してください。
オプション
サポートされる読み取りと書き込みのオプションについては、次の 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 パーサーでは、レコードを解析するときに、PERMISSIVE、DROPMALFORMED、FAILFAST の 3 つのモードがサポートされます。
rescuedDataColumn と併用することで、データ型の不一致が発生しても、DROPMALFORMED モードでレコードが削除されたり、FAILFAST モードでエラーが発生したりすることはありません。 削除されたりエラーが発生したりするのは、破損したレコード(不完全または構造が不正なJSON)だけです。 JSON の解析時に badRecordsPath オプションを使用する場合、データ型の不一致は、 rescuedDataColumnを使用するときに不適切なレコードとは見なされません。
badRecordsPath には、不完全で形式に誤りがある JSON レコードのみが格納されます。
例
次の例では、DataFrame API と SQL を使用して JSON ファイルを読み書きする方法を示します。
単一行モード
各行には、次の 1 つの 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()
スカラ (プログラミング言語)
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)
スカラ (プログラミング言語)
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 ファイルを読み取ることもできます。 ただし、read_filesではスキーマと追加のファイル処理オプションを指定できるため、databricks では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 Standard Edition でサポートされている文字セットの完全な一覧については、サポートされているエンコーディングに関する説明を参照してください。
ノートブックの例: JSON ファイルの読み取り
次のノートブックは、単一行と複数行のモードを示しています。