AWS Glue での ETL 入力および出力の形式オプション - AWS Glue

AWS Glue での ETL 入力および出力の形式オプション

AWS Glue の PySpark と Scala のさまざまなメソッドや変換では、format パラメータと format_options パラメータを使用して入力/出力形式を指定します。これらのパラメータでは以下の値を使用できます。

注記

現在、ストリーミング ETL ジョブでサポートされている形式は、JSON、CSV、Parquet、ORC、Avro、および Grok のみです。

AWS Lake Formation が管理するテーブルにアクセスするジョブの場合、AWS Glue は Lake Formation の管理するテーブルでサポートされているすべてのフォーマットの読み取りと書き込みをサポートします。現在サポートされている AWS Lake Formation が管理するテーブルのフォーマット一覧は、AWS Lake Formation デベロッパーガイドの「管理されたテーブルの注意点と制限事項」を参照してください。

注記

Apache Parquetを書き込むために、AWS Glue ETL では、ダイナミックフレーム用に最適化されたカスタム Parquet ライタータイプのオプションを指定することで、管理されたテーブルへの書き込みのみをサポートします。parquet フォーマットで管理されたテーブルに書き込む場合は、テーブルパラメータに true の値を用いてキー useGlueParquetWriter を追加する必要があります。

format="avro"

この値は、Apache Avro データ形式を指定します。

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

  • version – サポートする Apache Avro リーダー/ライター形式のバージョンを指定します。デフォルト値は「1.7」です。Avro 論理型の読み取りと書き込みを有効にするには、format_options={"version": “1.8”} を指定します。詳細については、「Apache Avro 1.7.7 の仕様」および「Apache Avro 1.8.2 の仕様」を参照してください。

    Apache Avro 1.8 コネクタは、次の論理型変換をサポートしています。

リーダーの場合: この表に、Avro リーダー 1.7 と 1.8 について、Avro データ型 (論理型と Avro プリミティブ型) と AWS GlueDynamicFrame データ型の間での型変換を示します。

Avro データ型:

論理型

Avro データ型:

Avro プリミティブ型

GlueDynamicFrame データ型:

Avro リーダー 1.7

GlueDynamicFrame データ型:

Avro リーダー 1.8

10 進数 バイト BINARY 10 進数
10 進数 固定 BINARY 10 進数
日付 int INT 日付
時間 (ミリ秒) int INT INT
時間 (マイクロ秒) long LONG LONG
タイムスタンプ (ミリ秒) long LONG タイムスタンプ
タイムスタンプ (マイクロ秒) long LONG LONG
所要時間 (論理型ではない) 12 で固定 BINARY BINARY

ライターの場合: この表に、Avro ライター 1.7 と 1.8 について、データ型と Avro データ型 AWS GlueDynamicFrame の間での型変換を示します。

AWS Glue DynamicFrame データ型 Avro データ型:

Avro ライター 1.7

Avro データ型:

Avro タイター 1.8

10 進数 文字列 decimal
日付 文字列 date
タイムスタンプ 文字列 timestamp-micros

format="csv"

この値は、データ形式として comma-separated-values を指定します (例については、RFC 4180 および RFC 7111 を参照してください)。

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

  • separator – 区切り文字を指定します。デフォルトではカンマ "," ですが、他の任意の文字を指定できます。

  • escaper – エスケープに使用する文字を指定します。このオプションは、CSV ファイルを読み取る場合にのみ使用します。デフォルト値は none です。有効にすると、直後の文字はそのまま使用されます。ただし、よく知られている小さいエスケープセット (\n\r\t\0) を除きます。

  • quoteChar – 引用に使用する文字を指定します。デフォルト値は二重引用符 '"' です。これに -1 を設定すると、全体的に引用が無効になります。

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

  • withHeader – 最初の行をヘッダーとして扱うかどうかを指定するブール値。デフォルト値は False です。このオプションは DynamicFrameReader クラスで使用できます。

  • writeHeader – 出力にヘッダーを書き込むかどうかを指定するブール値。デフォルト値は True です。このオプションは DynamicFrameWriter クラスで使用できます。

  • skipFirst – 最初のデータ行をスキップするかどうかを指定するブール値。デフォルト値は False です。

  • optimizePerformance – 高度な SIMD CSV リーダーで、Apache Arrow ベースの列指向メモリ形式を使用するかどうかを指定するブール値。これは、AWS Glue 3.0 でのみ使用できます。

次の例に、AWS Glue ETL ジョブのスクリプト内で、形式オプションを指定する方法を示します。

glueContext.write_dynamic_frame.from_options( frame = datasource1, connection_type = "s3", connection_options = { "path": "s3://s3path" }, format = "csv", format_options={ "quoteChar": -1, "separator": "|" }, transformation_ctx = "datasink2")

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

AWS Glue バージョン 3.0 では、Apache Arrow をインメモリ列形式として使用するためのサポートが追加されています。これにより、レコードを列形式でバッチ化することができます。バッチ処理により、レコードバッチ間でスキーマの変更を処理することに関連する CPU のボトルネックが軽減され、列バッファからのデータの取得効率が向上します。AWS Glue では、CPU SIMD 命令セットとマイクロパラレルアルゴリズムを使用して CSV リーダをベクトル化します。これらの最適化により、AWS Glue バージョン 3.0 では、行ベースの AWS Glue DynamicFrame または Spark DataFrames と比較して、パフォーマンスの大幅なスピードアップが達成されます。

Arrow 形式に最適化されたリーダーを使用するには、format_options またはテーブルのプロパティにおいて、「OptimizePerformance」を「true」に設定します。

glueContext.create_dynamic_frame.from_options( frame = datasource1, connection_type = "s3", connection_options = {"paths": ["s3://s3path"]}, format = "csv", format_options={ "optimizePerformance": True, "separator": "," }, transformation_ctx = "datasink2")

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

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

  • multiLine および escaper 形式オプションはサポートされません。デフォルトの escaper として二重引用符文字 「"」 を使用します。これらのオプションを設定すると、AWS Glue は自動的にフォールバックし、行ベースの CSV リーダーを使用するようになります。

  • ChoiceType の DynamicFrame の作成はサポートされません。

  • error records の DynamicFrame の作成はサポートされません。

  • 日本語や中国語など、マルチバイト文字を含む CSV ファイルからの読み取りはサポートされません。

format="ion"

この値は、データ形式として Amazon Ion を指定します。詳細については、Amazon Ion の仕様に関するドキュメントを参照してください。

現在 AWS Glue は出力で ion をサポートしていません。

format_optionsformat="ion" 値はありません。

format="grokLog"

この値は、1 つ以上の Logstash Grok パターンで指定されたログデータ形式を指定します (例については、「Logstash Reference (6.2]: Grok filter plugin」を参照してください)。

現在 AWS Glue は出力で groklog をサポートしていません。

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

  • logFormat – ログの形式と一致する Grok パターンを指定します。

  • customPatterns – ここで使用する追加の Grok パターンを指定します。

  • MISSING – 欠落した値の識別に使用するシグナルを指定します。デフォルト: '-'

  • LineCount – 各ログレコードの行数を指定します。デフォルト値は '1' です。現在 1 行のレコードのみがサポートされています。

  • StrictMode – strict モードを有効にするかどうかを指定するブール値。厳格モードでは、リーダーは自動的な型変換や復旧を行いません。デフォルト値は "false" です。

format="json"

この値は JSON(JavaScript Object Notation) データ形式を指定します。

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

  • jsonPath – レコードに読み込むオブジェクトを特定する JsonPath 式。これは、ファイルが外部配列内にネストされたレコードを含む場合に役立ちます。たとえば、次の JsonPath 式のターゲットは、JSON オブジェクトの id フィールドです。

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

format="orc"

この値は、データ形式として Apache ORC を指定します。詳細については、「LanguageManual ORC」を参照してください。

format_optionsformat="orc" 値はありません。ただし、基になる SparkSQL コードで受け入れられるオプションは、connection_options マップパラメータを介して渡すことができます。

format="parquet"

この値により、データ形式として Apache Parquet が指定されます。また同時に、DynamicFrame 用に最適化されたカスタム Parquet ライタータイプを使用するオプションも提供されます。書き込みのための、事前計算スキーマは必要ありません。useGlueParquetWriter オプションで指定された場合、ライターはデータの入力に応じて動的にスキーマを計算し変更します。

以下の format_options 値を使用できます。

  • useGlueParquetWriter – Dynamic Frame 用に最適化されたカスタム Parquet ライター型の使用を指定します。出力形式は Parquet です。

次の例を参照してください (ここで sink は、glue_context.getSink() が返すオブジェクトです)。

sink.setFormat("parquet", useGlueParquetWriter=True)

useGlueParquetWriter 指定時の制限:

  • ライターは、列の追加や削除などのスキーマの進化のみをサポートしますが、ResolveChoice のような列タイプの変更はサポートしません。。

  • ライターは、スキーマのみのファイルを保存することはできません。

  • オプションでは、データターゲットのフォーマットとしてのみ渡すことができます。

加えて、基盤となる SparkSQL コードで受け入れられるすべてのオプションは、connection_options マップパラメータを介し、この形式に渡されます。たとえば、mergeSchema のような Spark 構成を AWS Glue Spark リーダーに設定することで、すべてのファイルのスキーマをマージすることができます。

  • compression – Parquet ファイルを書き込む際に使用する圧縮コーデックを指定します。glueparquet 形式で使用される圧縮コーデックは、org.apache.parquet.hadoop.metadata.CompressionCodecName * との完全な互換性を持ちます。つまり、"uncompressed""snappy""gzip"、および "lzo" のサポートも含まれます。デフォルト値は "snappy" です。

  • blockSize – メモリにバッファされる行グループのバイト数を、メガバイトで指定します。デフォルト値は 134217728 (128 MB) です。

  • pageSize – 単一のレコードにアクセスするために完全に読み取る必要がある最小単位のサイズを、バイト数で指定します。デフォルト値は 1048576 (1 MB) です。

format="xml"

この値は、データ形式として XML を指定し、XML Data Source for Apache Spark パーサーのフォークを通じて解析されます。

現在、AWS Glue は出力用に "xml" をサポートしていません。

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

  • rowTag – 行として扱うファイル内の XML タグを指定します。行のタグを自己終了型にすることはできません。

  • encoding – 文字エンコードを指定します。デフォルト値は "UTF-8" です。

  • excludeAttribute – 要素の属性を除外するかどうかを指定するブール値。デフォルト値は "false" です。

  • treatEmptyValuesAsNulls – 空白文字を null 値として扱うかどうかを指定するブール値。デフォルト値は "false" です。

  • attributePrefix – 要素から区別するために属性に付加するプレフィックス。このプレフィックスをフィールド名として使用します。デフォルト値は "_" です。

  • valueTag – 要素内に子を持たない属性がある場合、値に使用するタグ。デフォルト: "_VALUE"

  • ignoreSurroundingSpaces – 値を囲む空白文字を無視するかどうかを指定するブール値。デフォルト値は "false" です。

  • withSchema – 予想されるスキーマを含む文字列値。このオプションを使用しない場合は、AWS Glue ではスキーマは XML データから推定されます。

これは、XML データ用にスキーマを指定するために、withSchema 形式オプションを使用する場合の例です。

schema = StructType([ Field("id", IntegerType()), Field("name", StringType()), Field("nested", StructType([ Field("x", IntegerType()), Field("y", StringType()), Field("z", ChoiceType([IntegerType(), StringType()])) ])) ]) datasource0 = create_dynamic_frame_from_options( connection_type, connection_options={"paths": ["s3://xml_bucket/someprefix"]}, format="xml", format_options={"withSchema": json.dumps(schema.jsonValue())}, transformation_ctx = "" )