JSON ファイル

単一行モードまたは複数行モードで JSON ファイルを読み取ることができます。 単一行モードでは、ファイルを複数の部分に分割して並列して読み取ることができます。 複数行モードでは、ファイルはエンティティ全体として読み込まれ、分割することはできません

詳細については、「JSON ファイル」を参照してください。

オプション

サポートされる読み取りと書き込みのオプションについては、次の Apache Spark 関連記事を参照してください。

復旧されたデータ列

Note

この機能は Databricks Runtime 8.2 (サポート期間終了) 以降でサポートされています。

復旧されたデータ列により、ETL 中にデータが失われたり、欠落したりすることがなくなります。 復旧されたデータ列には、指定されたスキーマから欠落しているか、型の不一致があるか、レコードまたはファイル内の列の大文字/小文字がスキーマ内のものと一致しないことが原因で解析されなかったデータが含まれます。 復旧されたデータ列は、復旧された列と、レコードのソース ファイル パスを含む JSON BLOB として返されます。 復旧されたデータ列からソース ファイル パスを削除するには、SQL 構成 spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false") を設定します。 オプション rescuedDataColumn を列名に設定することで、復旧されたデータ列を有効にできます。たとえば、spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load(<path>)_rescued_data です。

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

単一行モード

この例では、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"
    }
  }
]

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

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 オプションを使用して、文字セットを明示的に指定できます。

spark.read.option("charset", "UTF-16BE").format("json").load("fileInUTF16.json")

サポートされている文字セットには、UTF-8UTF-16BEUTF-16LEUTF-16UTF-32BEUTF-32LEUTF-32 などがあります。 Oracle Java Standard Edition でサポートされている文字セットの完全な一覧については、サポートされているエンコーディングに関する説明を参照してください。

ノートブックの例: JSON ファイルの読み取り

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

JSON ファイル読み取りのノートブック

ノートブックを入手