での ETL 出力のパーティションの管理AWS接着語 - AWS接着語

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

での ETL 出力のパーティションの管理AWS接着語

パーティション分割は、データセットを整理して効率的にクエリを実行可能にする重要な手法です。1 つまたは複数の列の個別の値に基づいて、データを階層形式のディレクトリ構造に整理します。

たとえば、Amazon Simple Storage Service (Amazon S3) のアプリケーションログを年月日別の日付でパーティション分割できます。次に 1 日分のデータに対応するファイルを s3://my_bucket/logs/year=2018/month=01/day=23/ などのプレフィックス別に配置します。Amazon Athena、Amazon Redshift Spectrum、そして今AWSGlue は、基になるすべてのデータを Amazon S3 から読み取ることなく、パーティション値でデータをフィルタできます。

クローラは、ファイルタイプとスキーマを推測するだけでなく、AWSGlue Data Catalog。結果のパーティション列は、AWSAmazon Athena のようなETL ジョブやクエリエンジン。

テーブルをクロールした後で、クローラで作成したパーティションを表示できます。左AWSGlue コンソール、テーブル左のナビゲーションペインの クローラによって作成されたテーブルを選択し、[パーティションの表示

Apache Hive 形式のパーティション分割されたパス (key=val 形式) の場合、クローラはキー名を使用して自動的に列名を事前設定します。それ以外の場合は、partition_0partition_1 などのデフォルト名が使用されます。コンソールでデフォルト名を変更するには、テーブルに移動して [Edit Schema (スキーマの編集)] を選択し、パーティション列の名前を変更します。

次に、ETL スクリプトでパーティション列をフィルタリングできます。パーティション情報はデータカタログに格納されるため、from_catalogAPI 呼び出しを使用して、パーティション列をDynamicFrame。たとえば、create_dynamic_frame.from_options ではなく create_dynamic_frame.from_catalog を使用します。

プッシュダウン述語を使用した事前フィルタ処理

多くの場合、プッシュダウン述語を使用してパーティションをフィルタリングできます。データセットのすべてのファイルをリストアップして読み取る必要はありません。データセット全体を読み取って DynamicFrame でフィルタリングする代わりに、データカタログのパーティションのメタデータに直接フィルタを適用できます。次に、実際に必要なものだけをリストアップして DynamicFrame 内に読み取ることができます。

たとえば、Python では以下のように記述できます。

glue_context.create_dynamic_frame.from_catalog( database = "my_S3_data_set", table_name = "catalog_data_table", push_down_predicate = my_partition_predicate)

これにより、データカタログのパーティションのうち、述語式を満たすものだけがロードされる DynamicFrame が作成されます。ロードするデータのサブセットを絞り込む度合いに応じて、処理時間を大幅に短縮できる場合があります。

述語式として、Spark SQL でサポートされている任意のブール式を使用できます。Spark SQL クエリで WHERE 句に指定できる条件は、すべて正常に動作します。たとえば、述語式pushDownPredicate = "(year=='2017' and month=='04')"は、データカタログ内のパーティションのみをロードします。year2017 に等しいmonth04 に等しい。詳細については、Apache Spark SQL のドキュメントを参照してください。特に Scala SQL 関数リファレンスが参考になります。

Amazon S3 パスのHive 形式のパーティション分割に加えて、Apache Parquet および Apache ORC ファイル形式では、さらに各ファイルを列値を表すデータのブロック単位にパーティション分割します。各ブロックにも、ブロック内のレコードに関する統計情報 (列の最小/最大値など) が保存されます。AWSGlue は、Hive 形式のパーティションと、これらの形式のブロックパーティションの両方でプッシュダウン述語をサポートしています。これにより、Parquet 形式と ORC 形式で不要な Amazon S3 パーティションを取り除き、列統計を使用して不要と判断したブロックをスキップできます。

パーティションの書き込み

デフォルトでは、DynamicFrame は書き込むときにパーティション分割されません。すべての出力ファイルは、指定した出力パスの最上位レベルに書き込まれます。最近まで、DynamicFrame をパーティションに書き込む唯一の方法は、書き込む前に Spark SQL DataFrame に変換することでした。

ただし、DynamicFrames ではキーのシーケンスを使用したネイティブのパーティション分割がサポートされるようになりました。この場合、シンクの作成時に partitionKeys オプションを使用します。たとえば、次の Python コードではデータセットを Parquet 形式で Amazon S3 に書き込みます。これらのディレクトリは、タイプフィールドに従ってパーティション分割されています。そこから、Amazon Athena などの他のシステムを使用して、これらのパーティションを処理できます。

glue_context.write_dynamic_frame.from_options( frame = projectedEvents, connection_type = "s3", connection_options = {"path": "$outpath", "partitionKeys": ["type"]}, format = "parquet")