

# パーティション射影を設定する
<a name="partition-projection-setting-up"></a>

テーブルのプロパティでのパーティション射影のセットアップは、次の 2 つのステップで行います。

1. 各パーティション列のデータ範囲と関連するパターンを指定するか、カスタムテンプレートを使用します。

1. テーブルのパーティション射影を有効にします。

**注記**  
パーティション射影プロパティを既存のテーブルに追加する前に、パーティション射影プロパティをセットアップするパーティションの列がテーブルスキーマにすでに存在している必要があります。パーティション列がまだ存在しない場合、既存のテーブルに手動でパーティション列を追加する必要があります。AWS Glue では、この手順を自動的に実行しません。

このセクションでは、AWS Glue にテーブルプロパティを設定する方法について説明します。これらを設定するには、AWS Glue コンソール、Athena [CREATE TABLE](create-table.md) クエリ、または [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html) オペレーションを使用できます。次の手順は、AWS Glue コンソールでプロパティを設定する方法を示しています。

**AWS Glue コンソールを使用してパーティション射影を設定して有効化する**

1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。

1. [**Tables**] (テーブル) タブを選択します。

   **[Tables]** (テーブル) タブでは、既存のテーブルを編集する、または **[Add tables]** (テーブルの追加) を選択して新しいテーブルを作成できます。テーブルを手動またはクローラで追加する方法については、「AWS Glue デベロッパーガイド」の「[AWS Glue コンソールでのテーブルの使用](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html)」を参照してください。

1. テーブルのリストで、編集するテーブルのリンクを選択します。  
![AWS Glue コンソールで、編集するテーブルを選択します。](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/partition-projection-1.png)

1. **[Actions]** (アクション)、**[Edit table]** (テーブルの編集) の順に選択します。

1. **[Edit table]** (テーブルの編集) ページの **[Table properties]** (テーブルプロパティ) セクションで、パーティション化された列ごとに以下のキーと値のペアを追加します。

   1. **[Key]** (キー)に、`projection.{{columnName}}.type` を追加します。

   1. [**値**] に、サポートされている型 (`enum`、`integer`、`date`、`injected`) のいずれかを追加します。詳細については、「[パーティション射影用にサポートされている型](partition-projection-supported-types.md)」(パーティション射影に対応した型) を参照してください。

1. 「[パーティション射影用にサポートされている型](partition-projection-supported-types.md)」のガイダンスに従って、設定要件に従って追加のキーと値のペアを追加します。

   次のテーブル設定例では、パーティション射影用に `year` 列を設定し、返すことのできる値を 2010～2016 の範囲に制限します。  
![AWS Glue コンソールのテーブルプロパティでパーティション列のパーティション射影を構成。](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/partition-projection-3.png)

1. キーと値のペアを追加して、パーティション射影を有効にします。[**Key**] (キー) には `projection.enabled` と入力し、その [**Value**] (値) には `true` と入力します。
**注記**  
`projection.enabled` を `false` に設定することで、このテーブルのパーティション射影をいつでも無効にできます。

1. 完了したら、[**Save **] を選択します。

1. Athena クエリエディタで、テーブル用に設定した列でのクエリをテストします。

   次のクエリ例では、`SELECT DISTINCT` を使用して、`year` 列から一意の値を返します。データベースには 1987 年から 2016 年のデータが含まれていますが、`projection.year.range` プロパティで返される値が 2010 年から 2016 年に制限されています。  
![パーティション射影を使用する列のクエリ。](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/partition-projection-5.png)
**注記**  
`projection.enabled` を `true` に設定したが、1 つ以上のパーティション列を設定できない場合は、次のようなエラーメッセージが表示されます。  
`HIVE_METASTORE_ERROR: Table {{database_name}}.{{table_name}} is configured for partition projection, but the following partition columns are missing projection configuration: [{{column_name}}] (table {{database_name}}.{{table_name}})`.

## カスタム S3 ストレージの場所を指定する方法
<a name="partition-projection-specifying-custom-s3-storage-locations"></a>

AWS Glue でテーブルプロパティを編集するときは、射影されたパーティションのカスタム Amazon S3 パステンプレートを指定することもできます。カスタムテンプレートは、Athena が通常の `.../column=value/...` パターンに従わないカスタム Amazon S3 ファイルの場所に、パーティション値を適切にマッピングすることを可能にします。

カスタムテンプレートの使用はオプションです。ただし、カスタムテンプレートを使用する場合、各パーティション列のプレースホルダをテンプレートに含める必要があります。テンプレート化された場所は、パーティション化されたデータファイルがパーティションごとの「フォルダ」に格納されるように、スラッシュで終わる必要があります。

**カスタムパーティションの場所のテンプレートを指定するには**

1. 手順に従って、[AWS Glue コンソールを使用して、パーティション射影の設定と有効化を行い](#partition-projection-setting-up-procedure)、次のようにカスタムテンプレートを指定するキーと値のペアを追加します。

   1. [**キー**] に「`storage.location.template`」と入力します。

   1. [**値**] で、すべてのパーティション列のプレースホルダを含む場所を指定します。各プレースホルダ (および S3 パス自体) が 1 つのスラッシュで終了していることを確認します。

      次のテンプレート値の例では、パーティション列 `a`、`b`、`c` があるテーブルを想定しています。

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/${c}/      
      ```

      ```
      s3://amzn-s3-demo-bucket/table_root/c=${c}/${b}/some_static_subdirectory/${a}/${b}/${c}/${c}/      
      ```

      同じテーブルの場合、次のテンプレート値の例は、列 `c` のプレースホルダが含まれていないため無効です。

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/         
      ```

1. [**Apply**] を選択します。