JSON ファイル

Spark SQL は、JSON データセットのスキーマを自動的に推測し、DataFrame として読み込むことができます。この変換は、JSON ファイルに対して SparkSession.read.json を使用して行うことができます。

「JSON ファイル」として提供されるファイルは、典型的な JSON ファイルではないことに注意してください。各行は、独立した有効な JSON オブジェクトを含む必要があります。詳細については、JSON Lines テキスト形式(改行区切り JSON とも呼ばれます) を参照してください。

通常の複数行 JSON ファイルの場合は、multiLine パラメータを True に設定してください。

# spark is from the previous example.
sc = spark.sparkContext

# A JSON dataset is pointed to by path.
# The path can be either a single text file or a directory storing text files
path = "examples/src/main/resources/people.json"
peopleDF = spark.read.json(path)

# The inferred schema can be visualized using the printSchema() method
peopleDF.printSchema()
# root
#  |-- age: long (nullable = true)
#  |-- name: string (nullable = true)

# Creates a temporary view using the DataFrame
peopleDF.createOrReplaceTempView("people")

# SQL statements can be run by using the sql methods provided by spark
teenagerNamesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
teenagerNamesDF.show()
# +------+
# |  name|
# +------+
# |Justin|
# +------+

# Alternatively, a DataFrame can be created for a JSON dataset represented by
# an RDD[String] storing one JSON object per string
jsonStrings = ['{"name":"Yin","address":{"city":"Columbus","state":"Ohio"}}']
otherPeopleRDD = sc.parallelize(jsonStrings)
otherPeople = spark.read.json(otherPeopleRDD)
otherPeople.show()
# +---------------+----+
# |        address|name|
# +---------------+----+
# |[Columbus,Ohio]| Yin|
# +---------------+----+
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/python/sql/datasource.py」にあります。

Spark SQL は、JSON データセットのスキーマを自動的に推測し、Dataset[Row] として読み込むことができます。この変換は、Dataset[String] または JSON ファイルに対して SparkSession.read.json() を使用して行うことができます。

「JSON ファイル」として提供されるファイルは、典型的な JSON ファイルではないことに注意してください。各行は、独立した有効な JSON オブジェクトを含む必要があります。詳細については、JSON Lines テキスト形式(改行区切り JSON とも呼ばれます) を参照してください。

通常の複数行 JSON ファイルの場合は、multiLine オプションを true に設定してください。

// Primitive types (Int, String, etc) and Product types (case classes) encoders are
// supported by importing this when creating a Dataset.
import spark.implicits._

// A JSON dataset is pointed to by path.
// The path can be either a single text file or a directory storing text files
val path = "examples/src/main/resources/people.json"
val peopleDF = spark.read.json(path)

// The inferred schema can be visualized using the printSchema() method
peopleDF.printSchema()
// root
//  |-- age: long (nullable = true)
//  |-- name: string (nullable = true)

// Creates a temporary view using the DataFrame
peopleDF.createOrReplaceTempView("people")

// SQL statements can be run by using the sql methods provided by spark
val teenagerNamesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
teenagerNamesDF.show()
// +------+
// |  name|
// +------+
// |Justin|
// +------+

// Alternatively, a DataFrame can be created for a JSON dataset represented by
// a Dataset[String] storing one JSON object per string
val otherPeopleDataset = spark.createDataset(
  """{"name":"Yin","address":{"city":"Columbus","state":"Ohio"}}""" :: Nil)
val otherPeople = spark.read.json(otherPeopleDataset)
otherPeople.show()
// +---------------+----+
// |        address|name|
// +---------------+----+
// |[Columbus,Ohio]| Yin|
// +---------------+----+
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/scala/org/apache/spark/examples/sql/SQLDataSourceExample.scala」にあります。

Spark SQL は、JSON データセットのスキーマを自動的に推測し、Dataset<Row> として読み込むことができます。この変換は、Dataset<String> または JSON ファイルに対して SparkSession.read().json() を使用して行うことができます。

「JSON ファイル」として提供されるファイルは、典型的な JSON ファイルではないことに注意してください。各行は、独立した有効な JSON オブジェクトを含む必要があります。詳細については、JSON Lines テキスト形式(改行区切り JSON とも呼ばれます) を参照してください。

通常の複数行 JSON ファイルの場合は、multiLine オプションを true に設定してください。

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;

// A JSON dataset is pointed to by path.
// The path can be either a single text file or a directory storing text files
Dataset<Row> people = spark.read().json("examples/src/main/resources/people.json");

// The inferred schema can be visualized using the printSchema() method
people.printSchema();
// root
//  |-- age: long (nullable = true)
//  |-- name: string (nullable = true)

// Creates a temporary view using the DataFrame
people.createOrReplaceTempView("people");

// SQL statements can be run by using the sql methods provided by spark
Dataset<Row> namesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19");
namesDF.show();
// +------+
// |  name|
// +------+
// |Justin|
// +------+

// Alternatively, a DataFrame can be created for a JSON dataset represented by
// a Dataset<String> storing one JSON object per string.
List<String> jsonData = Arrays.asList(
        "{\"name\":\"Yin\",\"address\":{\"city\":\"Columbus\",\"state\":\"Ohio\"}}");
Dataset<String> anotherPeopleDataset = spark.createDataset(jsonData, Encoders.STRING());
Dataset<Row> anotherPeople = spark.read().json(anotherPeopleDataset);
anotherPeople.show();
// +---------------+----+
// |        address|name|
// +---------------+----+
// |[Columbus,Ohio]| Yin|
// +---------------+----+
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/java/org/apache/spark/examples/sql/JavaSQLDataSourceExample.java」にあります。

Spark SQL は、JSON データセットのスキーマを自動的に推測し、DataFrame として読み込むことができます。 read.json() 関数を使用すると、各行が JSON オブジェクトである JSON ファイルのディレクトリからデータを読み込むことができます。

「JSON ファイル」として提供されるファイルは、典型的な JSON ファイルではないことに注意してください。各行は、独立した有効な JSON オブジェクトを含む必要があります。詳細については、JSON Lines テキスト形式(改行区切り JSON とも呼ばれます) を参照してください。

通常の複数行 JSON ファイルの場合は、名前付きパラメータ multiLineTRUE に設定してください。

# A JSON dataset is pointed to by path.
# The path can be either a single text file or a directory storing text files.
path <- "examples/src/main/resources/people.json"
# Create a DataFrame from the file(s) pointed to by path
people <- read.json(path)

# The inferred schema can be visualized using the printSchema() method.
printSchema(people)
## root
##  |-- age: long (nullable = true)
##  |-- name: string (nullable = true)

# Register this DataFrame as a table.
createOrReplaceTempView(people, "people")

# SQL statements can be run by using the sql methods.
teenagers <- sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")
head(teenagers)
##     name
## 1 Justin
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/r/RSparkSQLExample.R」にあります。
CREATE TEMPORARY VIEW jsonTable
USING org.apache.spark.sql.json
OPTIONS (
  path "examples/src/main/resources/people.json"
)

SELECT * FROM jsonTable

データソースオプション

JSON のデータソースオプションは、以下のように設定できます。

プロパティ名デフォルト意味スコープ
timeZone (spark.sql.session.timeZone 設定の値) JSON データソースまたはパーティション値をフォーマットする際に使用されるタイムゾーン ID を示す文字列を設定します。timeZone の以下の形式がサポートされています。
  • 地域ベースのゾーン ID: 「area/city」(例: 「America/Los_Angeles」)の形式である必要があります。
  • ゾーンオフセット: 「(+|-)HH:mm」の形式である必要があります(例: 「-08:00」または「+01:00」)。「UTC」および「Z」も「+00:00」のエイリアスとしてサポートされています。
「CST」などのその他の短い名前は、曖昧になる可能性があるため、使用しないことをお勧めします。
読み書き
primitivesAsString false すべてのプリミティブ値を文字列型として推測します。 読み込み
prefersDecimal false すべての浮動小数点値を decimal 型として推測します。値が decimal に収まらない場合は、double 型として推測されます。 読み込み
allowComments false JSON レコード内の Java/C++ スタイルのコメントを無視します。 読み込み
allowUnquotedFieldNames false 引用符で囲まれていない JSON フィールド名を許可します。 読み込み
allowSingleQuotes true 二重引用符に加えて、単一引用符を許可します。 読み込み
allowNumericLeadingZeros false 数値の先頭ゼロ(例: 00012)を許可します。 読み込み
allowBackslashEscapingAnyCharacter false バックスラッシュエスケープメカニズムを使用して、すべての文字を引用符で囲むことを許可します。 読み込み
mode PERMISSIVE 解析中の破損したレコードを処理するためのモードを許可します。
  • PERMISSIVE: 不正なレコードに遭遇した場合、columnNameOfCorruptRecord で設定されたフィールドに不正な文字列を格納し、不正なフィールドを null に設定します。破損したレコードを保持するために、ユーザーはユーザー定義スキーマに columnNameOfCorruptRecord という名前の文字列型フィールドを設定できます。スキーマにそのフィールドがない場合、解析中に破損したレコードはドロップされます。スキーマを推測する場合、出力スキーマに columnNameOfCorruptRecord フィールドが暗黙的に追加されます。
  • DROPMALFORMED: 不正なレコード全体を無視します。このモードは、JSON の組み込み関数ではサポートされていません。
  • FAILFAST: 破損したレコードに遭遇した場合、例外をスローします。
読み込み
columnNameOfCorruptRecord (spark.sql.columnNameOfCorruptRecord 設定の値) PERMISSIVE モードによって作成される不正な文字列を持つ新しいフィールドの名前を変更できます。これは spark.sql.columnNameOfCorruptRecord をオーバーライドします。 読み込み
dateFormat yyyy-MM-dd 日付を示す文字列を設定します。カスタム日付フォーマットは、 datetime pattern のフォーマットに従います。これは date 型に適用されます。 読み書き
timestampFormat yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX] タイムスタンプを示す文字列を設定します。カスタム日付フォーマットは、 datetime pattern のフォーマットに従います。これは timestamp 型に適用されます。 読み書き
timestampNTZFormat yyyy-MM-dd'T'HH:mm:ss[.SSS] タイムゾーンなしのタイムスタンプを示す文字列を設定します。カスタム日付フォーマットは、Datetime Patterns のフォーマットに従います。これはタイムゾーンなしの timestamp 型に適用されます。注意: このデータ型を書き込んだり読み込んだりする際には、ゾーンオフセットおよびタイムゾーンコンポーネントはサポートされていません。 読み書き
enableDateTimeParsingFallback タイムパーサーポリシーにレガシー設定がある場合、またはカスタムの日付またはタイムスタンプパターンが提供されていない場合に有効になります。 設定されたパターンに一致しない値の場合、日付とタイムスタンプの解析で下位互換性のある(Spark 1.x および 2.0)動作にフォールバックすることを許可します。 読み込み
multiLine false ファイルごとに 1 つのレコード(複数行にまたがる可能性がある)を解析します。JSON の組み込み関数は、このオプションを無視します。 読み込み
allowUnquotedControlChars false JSON 文字列に、引用符で囲まれていない制御文字(タブおよび改行文字を含む、値が 32 未満の ASCII 文字)を含めることを許可するかどうか。 読み込み
encoding multiLinetrue に設定されている場合(読み込み時)は自動検出、UTF-8(書き込み時) 読み込み時には、JSON ファイルの標準的な基本または拡張エンコーディング(例: UTF-16BE、UTF-32LE)のいずれかを強制的に設定できます。書き込み時には、保存される JSON ファイルのエンコーディング(文字セット)を指定します。JSON の組み込み関数は、このオプションを無視します。 読み書き
lineSep \r\r\n\n(読み込み時)、\n(書き込み時) 解析に使用すべき行区切り文字を定義します。JSON の組み込み関数は、このオプションを無視します。 読み書き
samplingRatio 1.0 スキーマ推論に使用される入力 JSON オブジェクトの割合を定義します。 読み込み
dropFieldIfAllNull false スキーマ推論中に、すべての値が null または空の配列である列を無視するかどうか。 読み込み
locale en-US IETF BCP 47 形式の言語タグとしてロケールを設定します。たとえば、locale は日付とタイムスタンプの解析中に使用されます。 読み込み
allowNonNumericNumbers true JSON パーサーが、「Not-a-Number」(NaN)トークンのセットを有効な浮動小数点値として認識することを許可します。
  • +INF: 正の無限大、および +InfinityInfinity のエイリアス。
  • -INF: 負の無限大、エイリアス -Infinity
  • NaN: ゼロ除算の結果など、その他の非数値。
読み込み
compression (なし) ファイルに保存する際に使用する圧縮コーデック。これは、認識されている大文字小文字を区別しない短縮名(none、bzip2、gzip、lz4、snappy、deflate)のいずれかです。JSON の組み込み関数は、このオプションを無視します。 書き込み
ignoreNullFields (spark.sql.jsonGenerator.ignoreNullFields 設定の値) JSON オブジェクトを生成する際に null フィールドを無視するかどうか。 書き込み
useUnsafeRow (spark.sql.json.useUnsafeRow 設定の値) JSON パーサーで struct 結果を表すために UnsafeRow を使用するかどうか。 読み込み

その他の一般的なオプションについては、 Generic File Source Options を参照してください。