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 を列名 ( _rescued_data with spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load(<path>)など) に設定します。

JSON パーサーは、レコードを解析するときに、 PERMISSIVEDROPMALFORMEDFAILFASTの 3 つのモードをサポートします。 rescuedDataColumnと一緒に使用すると、データ型の不一致によって、DROPMALFORMEDモードでレコードがドロップされたり、FAILFASTモードでエラーがスローされたりすることはありません。破損したレコード (つまり、不完全な JSON や不正な形式の JSON) のみがドロップされるか、エラーがスローされます。 JSON の解析時にオプション badRecordsPath を使用する場合、データ型の不一致は、 rescuedDataColumnの使用時に不良レコードとは見なされません。 不完全で不正な形式の JSON レコードのみが badRecordsPathに格納されます。

例:

単一行モード

この例では、1 行に 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 データを読み取るには、次を使用します。

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"
    }
  }
]

このオブジェクトを読み取るには、複数行モードを有効にします。

CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/tmp/multi-line.json",multiline=true)
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-8UTF-16BEUTF-16LEUTF-16UTF-32BEUTF-32LEUTF-32などがあります。 Oracle Java SEでサポートされている文字セットの完全なリストは、 サポートされているエンコーディングを参照してください。

ノートブックの例: read.json ファイル

次のノートブックは、単一行モードと複数行モードを示しています。

read.json ファイル ノートブック

ノートブックを新しいタブで開く