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としてロードできます。この変換には、ファイルの各行がJSONオブジェクトであるJSONファイルのディレクトリからデータをロードするread.json()関数を使用します。

jsonファイルとして提供されるファイルは、一般的なJSONファイルではないことに注意してください。各行には、個別の、自己完結型の有効なJSONオブジェクトが含まれている必要があります。詳細については、JSON Linesテキスト形式(改行区切りJSONとも呼ばれます)を参照してください。

通常の複数行JSONファイルの場合は、multiLineという名前付きパラメーターをTRUEに設定します。

# 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: 'America/Los_Angeles'のような 'area/city' の形式である必要があります。
  • ゾーンオフセット:'-08:00'や'+01:00'のような '(+|-)HH:mm' の形式である必要があります。また、 'UTC' と 'Z' は '+00:00' のエイリアスとしてサポートされています。
'CST'のような他の短い名前は、あいまいになる可能性があるため、使用することは推奨されません。
読み取り/書き込み
primitivesAsString false すべてのプリミティブ値を文字列型として推論します。 読み取り
prefersDecimal false すべての浮動小数点値を10進数型として推論します。値が10進数に収まらない場合、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 日付形式を示す文字列を設定します。カスタム日付形式は、日付/時刻パターンの形式に従います。これはdate型に適用されます。 読み取り/書き込み
timestampFormat yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX] タイムスタンプ形式を示す文字列を設定します。カスタム日付形式は、日付/時刻パターンの形式に従います。これはtimestamp型に適用されます。 読み取り/書き込み
timestampNTZFormat yyyy-MM-dd'T'HH:mm:ss[.SSS] タイムゾーンなしのタイムスタンプ形式を示す文字列を設定します。カスタム日付形式は、日付/時刻パターンの形式に従います。これはタイムゾーンなしのタイムスタンプ型に適用されます。このデータ型の書き込みまたは読み取り時には、ゾーンオフセットおよびタイムゾーンコンポーネントはサポートされないことに注意してください。 読み取り/書き込み
enableDateTimeParsingFallback タイムパーサーポリシーにレガシー設定がある場合、またはカスタムの日付またはタイムスタンプパターンが提供されていない場合に有効になります。 値が設定されたパターンと一致しない場合、日付とタイムスタンプの解析の旧バージョンの互換性のある(Spark 1.xおよび2.0)動作にフォールバックできます。 読み取り
multiLine false ファイルごとに、複数行にまたがる可能性のある1つのレコードを解析します。JSON組み込み関数はこのオプションを無視します。 読み取り
allowUnquotedControlChars false JSON文字列に、引用符で囲まれていない制御文字(タブや改行文字など、値が32未満のASCII文字)を含めることができるかどうかを制御します。 読み取り
encoding multiLinetrue(読み取りの場合)、UTF-8(書き込みの場合)に設定されている場合は自動的に検出されます 読み取りの場合、JSONファイルの標準的な基本または拡張エンコーディングの1つを強制的に設定できます。たとえば、UTF-16BE、UTF-32LEなどです。書き込みの場合、保存されたjsonファイルのエンコーディング(charset)を指定します。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パーサーが「非数値」(NaN)トークンのセットを、有効な浮動小数点数値として認識することを許可します。
  • +INF:正の無限大の場合、+InfinityおよびInfinityのエイリアスとしても機能します。
  • -INF:負の無限大の場合、-Infinityのエイリアスです。
  • NaN:ゼロによる除算の結果など、その他の非数値の場合。
読み取り
compression (なし) ファイルに保存するときに使用する圧縮コーデック。これは、既知の大文字と小文字を区別しない短縮名(none、bzip2、gzip、lz4、snappy、deflate)のいずれかです。JSON組み込み関数はこのオプションを無視します。 書き込み
ignoreNullFields (spark.sql.jsonGenerator.ignoreNullFields構成の値) JSONオブジェクトを生成するときにnullフィールドを無視するかどうか。 書き込み

その他の汎用オプションは、汎用ファイルソースオプションにあります。