AWS Glue での JSON フォーマットの使用 - AWS Glue

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Glue での JSON フォーマットの使用

AWS Glue はソースからデータを取得し、さまざまなデータ形式で保存および転送されるターゲットにデータを書き込みます。データが JSON データ形式で保存または転送される場合、このドキュメントでは AWS Glue でデータを使用するために利用できる機能を紹介します。

AWS Glue は JSON 形式の使用をサポートしています。この形式は、行ベースまたは列ベースではなく、形状は一貫しているが内容は柔軟なデータ構造を表します。JSON は、複数の機関が発行する並列した規格で定義されており、そのうちの 1 つが ECMA-404 です。一般的に参照されるソースによる形式の概要については、「Introducing JSON」(JSON の概要) を参照してください。

AWS Glue を使用して、Amazon S3 から JSON ファイルを読み取るだけでなくbzipgzip圧縮された JSON ファイルも読み取ることができます。このページで説明する設定ではなく、S3 接続パラメータ 上で圧縮動作を設定します。

読み込み 書き込み ストリーミングの読み取り 小さなファイルのグループ化 ジョブのブックマーク
サポート サポート対象 サポート対象 サポート対象 サポート

例: S3 から JSON ファイルまたはフォルダを読み取る

前提条件: 読み取る JSON ファイルまたはフォルダへの S3 パス (s3path) が必要です。

設定: 関数オプションで format="json" を指定します。connection_options で、paths キーを使用して s3path を指定します。さらに、接続オプションで、読み取り操作がS3 を通過する方法を変更することができます。詳細については、「Amazon S3 接続のオプションのリファレンス」を参照してください。リーダーが JSON ファイルを解釈する方法は、format_options で設定できます。詳細については、JSON 設定リファレンスを参照してください。

次の AWS Glue ETL スクリプトは、S3 から JSON ファイルまたはフォルダーを読み取るプロセスを示しています。

Python

この例では create_dynamic_frame.from_options メソッドを使用します。

# Example: Read JSON from S3 # For show, we handle a nested JSON file that we can limit with the JsonPath parameter # For show, we also handle a JSON where a single entry spans multiple lines # Consider whether optimizePerformance is right for your workflow. from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) spark = glueContext.spark_session dynamicFrame = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={"paths": ["s3://s3path"]}, format="json", format_options={ "jsonPath": "$.id", "multiline": True, # "optimizePerformance": True, -> not compatible with jsonPath, multiline } )

スクリプト (pyspark.sql.DataFrame) DataFrames でも使用できます。

dataFrame = spark.read\ .option("multiLine", "true")\ .json("s3://s3path")
Scala

この例では、getSourceWithFormat オペレーションを使用します。

// Example: Read JSON from S3 // For show, we handle a nested JSON file that we can limit with the JsonPath parameter // For show, we also handle a JSON where a single entry spans multiple lines // Consider whether optimizePerformance is right for your workflow. import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val dynamicFrame = glueContext.getSourceWithFormat( formatOptions=JsonOptions("""{"jsonPath": "$.id", "multiline": true, "optimizePerformance":false}"""), connectionType="s3", format="json", options=JsonOptions("""{"paths": ["s3://s3path"], "recurse": true}""") ).getDynamicFrame() } }

スクリプト (pyspark.sql.DataFrame) DataFrames でも使用できます。

val dataFrame = spark.read .option("multiLine", "true") .json("s3://s3path")

例: JSON ファイルおよびフォルダを S3 に書き込む

前提条件:初期化された DataFrame (dataFrame) または () が必要です。 DynamicFrame dynamicFrameまた、予想される S3 出力パスである s3path も必要になります。

設定: 関数オプションで format="json" を指定します。connection_options で、paths キーを使用して s3path を指定します。ライターが S3 と対話する方法を、connection_options でさらに詳しく変更することができます。詳細については、 AWS Glue: Amazon S3 接続のオプションのリファレンス の ETL 入力と出力のデータ形式オプションを参照してください。ライターが JSON ファイルを解釈する方法は、format_options で設定できます。詳細については、JSON 設定リファレンスを参照してください。

次の AWS Glue ETL スクリプトは、S3 から JSON ファイルまたはフォルダを書き込むプロセスを示しています。

Python

この例では write_dynamic_frame.from_options メソッドを使用します。

# Example: Write JSON to S3 from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) glueContext.write_dynamic_frame.from_options( frame=dynamicFrame, connection_type="s3", connection_options={"path": "s3://s3path"}, format="json" )

スクリプト (pyspark.sql.DataFrame) DataFrames でも使用できます。

df.write.json("s3://s3path/")
Scala

この例では、getSinkWithFormat メソッドを使用します。

// Example: Write JSON to S3 import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) glueContext.getSinkWithFormat( connectionType="s3", options=JsonOptions("""{"path": "s3://s3path"}"""), format="json" ).writeDynamicFrame(dynamicFrame) } }

スクリプト (pyspark.sql.DataFrame) DataFrames でも使用できます。

df.write.json("s3://s3path")

JSON 設定リファレンス

format="json" には、以下の format_options 値を使用できます。

  • jsonPathJsonPathレコードに読み込まれるオブジェクトを識別する式。これは、ファイルが外部配列内にネストされたレコードを含む場合に役立ちます。たとえば、 JsonPath 次の式は JSON id オブジェクトのフィールドを対象としています。

    format="json", format_options={"jsonPath": "$.id"}
  • multiLine — 単一のレコードが複数行にまたがることができるかどうかを指定するブール値。これが発生するのは、フィールドに引用符で囲まれた改行文字がある場合などです。複数行にまたがるレコードがある場合は、このオプションを "true" に設定する必要があります。デフォルト値は "false" であり、解析時によりアグレッシブなファイル分割を可能にします。

  • optimizePerformance – 高度な SIMD JSON リーダーで、Apache Arrow ベースの列指向メモリ形式を使用するかどうかを指定するブール値。これは、AWS Glue 3.0 でのみ使用できます。multiLine または jsonPath と互換性がありません。これらのオプションのいずれかを指定すると、 AWS Glue は標準リーダーにフォールバックするよう指示します。

  • withSchema — 「XML スキーマを手動で指定する」で説明されている形式でテーブルスキーマを指定する文字列の値。非カタログ接続から読み取る場合にのみ、optimizePerformance で使用されます。

Apache Arrow 列指向形式によりベクトル化された SIMD JSON リーダーの使用

AWS Glue バージョン 3.0 では、JSON データ用のベクター化されたリーダーが追加されています。特定の条件下では、標準のリーダーと比較して 2 倍高速に動作します。このリーダーには、このセクションに記載されているように、ユーザーが使用前に知っておく必要のある特定の制限があります。

最適化されたリーダーを使用するには、format_options またはテーブルプロパティで "optimizePerformance" を True に設定します。カタログを読み取らない限り、withSchema を指定する必要もあります。withSchema は、「XML スキーマを手動で指定する」で説明されている入力を期待します

// Read from S3 data source glueContext.create_dynamic_frame.from_options( connection_type = "s3", connection_options = {"paths": ["s3://s3path"]}, format = "json", format_options={ "optimizePerformance": True, "withSchema": SchemaString }) // Read from catalog table glueContext.create_dynamic_frame.from_catalog( database = database, table_name = table, additional_options = { // The vectorized reader for JSON can read your schema from a catalog table property. "optimizePerformance": True, })

AWS Glue SchemaStringライブラリでビルドする方法の詳細については、を参照してくださいPySpark 拡張子型

ベクトル化された CSV リーダーでの制限事項

以下の制限事項に留意してください。

  • ネストされたオブジェクトまたは配列値を持つ JSON 要素はサポートされていません。指定した場合、 AWS Glue は標準リーダーにフォールバックします。

  • カタログから、または withSchema で、スキーマを指定する必要があります。

  • multiLine または jsonPath と互換性がありません。これらのオプションのいずれかを指定すると、 AWS Glue は標準リーダーにフォールバックするよう指示します。

  • 入力スキーマと一致しない入力レコードを指定すると、リーダーは失敗します。

  • エラーレコードは作成されません。

  • マルチバイト文字 (日本語や中国語の文字など) を含む JSON ファイルはサポートされていません。