JSON ファイルの読み取りと書き込み

JSON (JavaScript Object Notation) は、データ交換とストレージに広く使用されている半構造化形式です。 Azure Databricksでは、単一行モードと複数行モード、自動スキーマ推論、復旧データなど、Apache Spark での読み取りと書き込みの両方に JSON がサポートされます。 Spark DataFrame API または SQL を使用してクラウド ストレージから JSON ファイルを読み取り、DataFrames を JSON に書き戻すことができます。

前提条件

Azure Databricksでは、JSON ファイルを使用するための追加の構成は必要ありません。

オプション

.option().options()DataFrameReaderメソッドとDataFrameWriterメソッドを使用して、JSON データ ソースを構成します。 サポートされているオプションの完全な一覧については、JSON オプションのDataFrameReaderJSON オプションのDataFrameWriterを参照してください。

Usage

次の例では 、Wanderbricks サンプル データセットを使用して、Spark DataFrame API と SQL を使用して、単一行モードと複数行モードで JSON ファイルを読み書きする方法を示します。

JSON ファイルの書き込みと読み取り

単一行モード (既定) では、出力の各行に 1 つの完全な JSON オブジェクトが含まれます。 Wanderbricks レビューを JSON 形式に書き込み、読み戻します。

Python

# Write wanderbricks reviews to JSON format
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("json").save("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

# Read the JSON files into a DataFrame
df = spark.read.format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
df.printSchema()
display(df)

スカラ (プログラミング言語)

// Write wanderbricks reviews to JSON format
val reviews = spark.read.table("samples.wanderbricks.reviews")
reviews.write.format("json").save("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

// Read the JSON files into a DataFrame
val df = spark.read.format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
df.printSchema()
df.show()

複数行の JSON ファイルを読み取る

複数行モードでは、1 つの JSON オブジェクトを複数行にまたがることができます。 複数行モードを有効にして、複数行にわたってレコードが書式設定されている JSON ファイルを読み取ります。

Python

mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(truncate=False)

スカラ (プログラミング言語)

val mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(false)

SQL

CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/Volumes/<catalog>/<schema>/<volume>/multi-line.json",multiline=true)

SQL を使用して JSON ファイルを読み取る

SQL のテーブル値関数テーブル値関数read_filesを使用して、JSON ファイルを読み取ることができます。

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_json',
  format => 'json',
  multiLine => true)

USING JSONを使用して JSON ファイルを読み取ることもできます。 ただし、read_filesではスキーマと追加のファイル処理オプションを指定できるため、databricks ではUSING JSONの代わりにread_filesを使用することをお勧めします。

DROP TABLE IF EXISTS reviews_json_table;

CREATE TABLE reviews_json_table
USING JSON
OPTIONS (path "/Volumes/<catalog>/<schema>/<volume>/reviews_json", multiline true);

SELECT * FROM reviews_json_table;

文字エンコードを指定する

既定では、入力ファイルの文字セットは自動的に検出されます。 charset オプションを使用して、文字セットを明示的に指定できます。

Python

spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")

スカラ (プログラミング言語)

spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json',
  format => 'json',
  charset => 'UTF-16BE'
)

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

復旧されたデータ列を有効にする

復旧されたデータ列により、ETL 中にデータが失われることはありません。 レコード内の 1 つ以上のフィールドに次のいずれかの問題があるため、解析されなかったデータがキャプチャされます。

  • 指定されたスキーマに存在しない。
  • 指定されたスキーマのデータ型と一致しない。
  • 指定されたスキーマのフィールド名と大文字と小文字の区別が一致しない。

復旧されたデータ列は、復旧された列とレコードのソース ファイル パスを含む JSON BLOB として返されます。

復旧されたデータ列を有効にするには、読み取り時に rescuedDataColumn オプションを列名に設定します。

Python

df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

スカラ (プログラミング言語)

val df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_json',
  format => 'json',
  rescuedDataColumn => '_rescued_data'
)

復旧されたデータ列からソース ファイルのパスを削除するには、次の値を設定します。

spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")

JSON パーサーでは、レコードを解析するときに、PERMISSIVEDROPMALFORMEDFAILFAST の 3 つのモードがサポートされます。 rescuedDataColumnと共に使用する場合は、次の規則が適用されます。

  • データ型が一致しない場合でも、DROPMALFORMED モードでレコードが破棄されたり、FAILFAST モードでエラーが発生したりすることはありません。
  • 削除されたりエラーが発生したりするのは、破損したレコード(不完全または構造が不正なJSON)だけです。
  • badRecordsPath オプションを使用する場合、データ型の不一致は無効なレコードとは見なされません。 badRecordsPath には、不完全で形式に誤りがある JSON レコードのみが格納されます。

その他のリソース

  • Parquet ファイルの読み取りと書き込み: ワークロードが主に分析的で読み取り負荷が高い場合、Parquet の列レイアウトでは、JSON の行ベースのテキスト形式よりも効率的なクエリ パフォーマンスが提供されます。
  • Avro ファイルの読み取りと書き込み: Apache Kafka などのイベント ストリーミング システムから JSON を生成または使用する場合、Avro はスキーマ進化のサポートによりコンパクトなバイナリ エンコードを提供します。