JSONファイル
read.jsonファイルは、単一行 モードまたは複数行 モードで できます。1 行モードでは、ファイルを多くの部分に分割し、並行して読み取ることができます。 複数行モードでは、ファイルはエンティティ全体としてロードされ、分割 することはできません 。
詳細については、 Apache SparkのJSONファイルに関するドキュメントを参照してください。
オプション
サポートされている読み取り/書き込みオプションについては、次の Apache Spark 参照記事をご覧ください。
救出されたデータ列
この機能は、Databricks Runtime 8.2以降でサポートされています。
復元されたデータ列により、ETL処理中にデータが失われることがなくなります。救出されたデータ列には、指定されたスキーマにデータが存在しない、型の不一致がある、またはレコードやファイル内の列の大文字小文字がスキーマ内の列の大文字小文字と一致しないなどの理由で解析されなかったデータが含まれます。復元されたデータ列は、復元された列とレコードのソースファイルパスを含むJSONブロブとして返されます。復元されたデータ列からソースファイルパスを削除するには、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
- Scala
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
- Scala
- SQL
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)
CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/tmp/multi-line.json",multiline=true)
SQLを使用してjsonファイルをread.json
SQLのテーブル値関数read_filesを使用して、.json ファイルをread.jsonことができます。
SELECT * FROM read_files(
'<path to json file or folder>',
format => 'json',
multiLine => true)
USING JSONを使用して json ファイルをread.jsonこともできます。 ただし、DatabricksはUSING JSONではなくread_filesを使用することを推奨しています。なぜなら、 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 SEでサポートされている文字セットの完全なリストは、 サポートされているエンコーディングを参照してください。
ノートブックの例: read.json ファイル
次のノートブックは、単一行モードと複数行モードを示しています。