

# Amazon Athena でパーティション射影を使用する
<a name="partition-projection"></a>

Athena では、高度にパーティションされたテーブルのクエリ処理を高速化し、パーティション管理を自動化するためにパーティション射影を使用できます。

パーティション射影では、Athena は AWS Glue のテーブルに直接設定したテーブルプロパティを使用してパーティション値と場所を計算します。テーブルプロパティにより、Athena は AWS Glue Data Catalogで時間をかけてメタデータを検索しなくても、必要なパーティション情報を「射影」または決定できます。多くの場合、インメモリオペレーションはリモートオペレーションよりも高速であるため、パーティション射影は高度にパーティションされたテーブルに対するクエリの実行時間を短縮できます。クエリおよび基盤となるデータの特定の特性によっては、パーティション射影によって、パーティションメタデータの取得時に制限されているクエリのクエリランタイムが大幅に短縮されます。

## パーティションプルーニングとパーティション射影を理解する
<a name="partition-projection-pruning-vs-projection"></a>

パーティションプルーニングは、メタデータを収集し、クエリに適用されるパーティションのみに「プルーニング」します。多くの場合、これによってクエリが高速化されます。Athena は、パーティション射影用に設定されたテーブルなどのパーティション列があるすべてのテーブルに対してパーティションプルーニングを使用します。

通常、クエリを処理する場合、Athena はパーティションプルーニングを実行する前に AWS Glue Data Catalog に対して `GetPartitions` 呼び出しを行います。テーブルに多数のパーティションがある場合、`GetPartitions` を使用すると、パフォーマンスに悪影響が及ぶ可能性があります。これを回避するには、パーティション射影を使用します。パーティション射影を設定すると、Athena が独自にパーティションを構築するために必要なすべての情報を得ることができるため、`GetPartitions` を呼び出す必要がなくなります。

## パーティション射影の使用方法
<a name="partition-projection-using"></a>

パーティション射影を使用するには、AWS Glue Data Catalog または [外部 Hive メタストア](connect-to-data-source-hive.md)のテーブルプロパティで、各パーティション列のパーティション値と射影型の範囲を指定します。テーブル上のこれらのカスタムプロパティは、Athena がテーブルでクエリを実行するときに、どのパーティションパターンを期待すべきかを把握できるようにします。クエリの実行中、Athena は、この情報を使用して、パーティション値を射影します。AWS Glue Data Catalog または外部 Hive メタストアから取得するのではありません。これにより、クエリの実行時間が短縮されるだけでなく、Athena、AWS Glue、または外部の Hive メタストアでパーティションを手動で作成する必要がなくなるため、パーティション管理も自動化されます。

**重要**  
テーブルでパーティション射影を有効にすると、AWS Glue Data Catalog または Hive メタストア内のテーブルに登録されているパーティションメタデータが Athena によりすべて無視されます。

## 一部のユースケース
<a name="partition-projection-use-cases"></a>

パーティション射影が役立つシナリオには、次のようなものがあります。
+ 高度にパーティション化されたテーブルに対するクエリが、思ったほどすぐに完了しない。
+ データに新しい日付または時刻パーティションが作成されたとき、定期的にパーティションをテーブルに追加する。パーティション射影で、新しいデータが到着したときに使用できる相対日付範囲を設定している。
+ Amazon S3 に高度にパーティションされたデータがある。データは、AWS Glue Data Catalog または Hive メタストア内のモデルに対して実用的ではなく、クエリがそのごく一部のみを読み込む。

### 射影可能なパーティション構造
<a name="partition-projection-known-data-structures"></a>

パーティション射影は、パーティションが次のような予測可能なパターン (ただし、これに限りません) に従う場合に最も簡単に設定できます。
+ **整数** – `[1, 2, 3, 4, ..., 1000]` または `[0500, 0550, 0600, ..., 2500]` などの整数の連続的なシーケンス。
+ **日付** – `[20200101, 20200102, ..., 20201231]` または `[1-1-2020 00:00:00, 1-1-2020 01:00:00, ..., 12-31-2020 23:00:00]` などの日付や日時の連続的なシーケンス。
+ **列挙値** – 空港コードや AWS リージョン など、列挙値の有限集合。
+ **AWS のサービス ログ** – AWS のサービス ログは通常、AWS Glue で指定できるので Athena がパーティション射影に使用できるパーティションスキームを持つ既知の構造になっています。

### パーティションパステンプレートをカスタマイズする方法
<a name="partition-projection-custom-s3-storage-locations"></a>

デフォルトで、Athena はフォーム `s3://amzn-s3-demo-bucket/{{<table-root>}}/partition-col-1={{<partition-col-1-val>}}/partition-col-2={{<partition-col-2-val>}}/` を使用してパーティションの場所を構築しますが、データの編成が異なる場合、Athena はこのパステンプレートをカスタマイズするためのメカニズムを提供します。手順については、「[カスタム S3 ストレージの場所を指定する方法](partition-projection-setting-up.md#partition-projection-specifying-custom-s3-storage-locations)」を参照してください。

## 考慮事項と制限事項
<a name="partition-projection-considerations-and-limitations"></a>

以下の考慮事項に注意してください。
+ パーティション射影により、AWS Glue または外部 Hive メタストアでパーティションを手動で指定する必要がなくなります。
+ テーブルでパーティション射影を有効にすると、そのテーブルについては、Athena は AWS Glue Data Catalog 内または外部 Hive メタストア内のパーティションメタデータを無視します。
+ 射影されたパーティションが Amazon S3 に存在しない場合でも、Athena はそのパーティションを射影します。Athena はエラーをスローし、データを返しません。ただし、空のパーティションが多すぎる場合、従来の AWS Glue パーティションに比べてパフォーマンスが低下する可能性があります。射影パーティションの半分以上が空の場合は、従来のパーティションを使用することをお勧めします。
+ パーティション射影に定義された範囲境界を超える値のクエリは、エラーを返しません。その代わりに、クエリが実行されても行は返されません。たとえば、2020 年に開始される時間関連データがあり、`'projection.timestamp.range'='2020/01/01,NOW'` として定義されている場合、`SELECT * FROM {{table-name}} WHERE timestamp = '2019/02/02'` のようなクエリは正常に完了しますが、行は返されません。
+ パーティション射影は、テーブルが Athena を通じてクエリされる場合以外は使用できません。同じテーブルが Amazon Redshift Spectrum、Athena for Spark、Amazon EMR などの別のサービスを介して読み取られる場合、標準のパーティションメタデータが使用されます。
+ パーティション射影は DML 限定の機能であるため、`SHOW PARTITIONS` は、Athena によって射影されていても、AWS Glue カタログまたは外部の Hive メタストアには登録されていないパーティションをリストしません。
+ Athena は、パーティションの射影の設定としてビューのテーブルプロパティを使用しません。この制限を回避するには、ビューが参照するテーブルのテーブルプロパティでパーティション射影を構成して有効にします。

## 動画
<a name="partition-projection-video"></a>

以下の動画は、パーティション射影を使用して Athena でのクエリのパフォーマンスを向上させる方法を紹介するものです。

[![AWS Videos](http://img.youtube.com/vi/iUD5pPpcyZk/0.jpg)](http://www.youtube.com/watch?v=iUD5pPpcyZk)


**Topics**
+ [パーティションプルーニングとパーティション射影を理解する](#partition-projection-pruning-vs-projection)
+ [パーティション射影の使用方法](#partition-projection-using)
+ [一部のユースケース](#partition-projection-use-cases)
+ [考慮事項と制限事項](#partition-projection-considerations-and-limitations)
+ [動画](#partition-projection-video)
+ [パーティション射影を設定する](partition-projection-setting-up.md)
+ [パーティション射影用にサポートされている型](partition-projection-supported-types.md)
+ [動的な ID パーティショニングを使用する](partition-projection-dynamic-id-partitioning.md)
+ [Amazon Data Firehose 例](partition-projection-kinesis-firehose-example.md)