

# メタデータの手動定義
<a name="populate-dg-manual"></a>

 AWS Glue データカタログは、データソースとデータセットに関するメタデータを保存する中央リポジトリです。クローラーは、サポートされているデータソースのメタデータを自動的にクロールして入力できますが、データカタログでメタデータを手動で定義する必要があるシナリオがいくつかあります。
+ サポートされていないデータ形式 – クローラーでサポートされていないデータソースがある場合は、データカタログでそれらのデータソースのメタデータを手動で定義する必要があります。
+ カスタムメタデータ要件 — AWS Glue クローラー は、事前定義されたルールと規則に基づいてメタデータを推測します。AWS Glue クローラー で推測されたメタデータでカバーされない特定のメタデータ要件がある場合は、ニーズに合わせてメタデータを手動で定義できます。
+ データガバナンスと標準化 — データガバナンス、コンプライアンス、またはセキュリティ上の理由から、メタデータ定義をより細かくコントロールする必要がある場合があります。メタデータを手動で定義することで、そのメタデータが組織の標準とポリシーに準拠していることを保証できます。
+ 将来のデータインジェストのためのプレースホルダー – すぐに使用またはアクセスできないデータソースがある場合は、プレースホルダーとして空のスキーマテーブルを作成できます。データソースが利用可能になったら、事前定義された構造を維持しながら、テーブルに実際のデータを入力できます。

 メタデータを手動で定義するには、AWS Glue コンソール、Lake Formation コンソール、AWS Glue API、または AWS Command Line Interface (AWS CLI) を使用できます。データベース、テーブル、パーティションを作成し、列名、データ型、説明、その他の属性などのメタデータプロパティを指定できます。

# データベースの作成
<a name="define-database"></a>

データベースは、メタデータテーブルを AWS Glue で組織化するために使用されます。AWS Glue Data Catalog でテーブルを定義すると、データベースに追加します。1 つのテーブルは、1 つのデータベースにしか含まれません。

データベースには、数多くのさまざまなデータストアからのデータを定義するテーブルを含めることができます。このデータには、Amazon Simple Storage Service (Amazon S3) のオブジェクトと、Amazon Relational Database Service のリレーショナルテーブルを含めることができます。

**注記**  
データベースを AWS Glue Data Catalog から削除すると、データベース内のすべてのテーブルも削除されます。

 データベースのリストを表示するには、AWS マネジメントコンソール にサインインして、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。[**Databases**] (データベース) を選択し、リスト内のデータベース名を選択して詳細を表示します。

 ** コンソールの [**DatabasesAWS Glue] (データベース) タブからデータベースの追加、編集、削除ができます。
+ 新しいデータベースを作成するには、[**Add database**] (データベースを追加) を選択し名前と説明を指定します。Apache Hive など、その他のメタデータストアとの互換性を考慮して、名前は小文字に変換されます。
**注記**  
Amazon Athena からデータベースにアクセスする場合は、英数字とアンダースコア文字のみを使用して名前を指定してください。詳細については、[Athena での名前](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html#ate-table-database-and-column-names-allow-only-underscore-special-characters)を参照してください。
+  データベースの説明を編集するには、データベース名の横にあるチェックボックスを選択し、**[Edit]** (編集) を選択します。
+  データベースを削除するには、データベース名の横にあるチェックボックスを選択し、**[Remove]** (削除) を選択します。
+  データベースに含まれるテーブルのリストを表示するには、データベース名を選択します。そうすると、データベースプロパティにデータベース内のすべてのテーブルが表示されます。

クローラーで書き込みが行われたデータベースを変更するには、クローラー定義を変更する必要があります。詳細については、「[クローラーを使用したデータカタログへの入力](add-crawler.md)」を参照してください。

## データベースリソースリンク
<a name="databases-resource-links"></a>


|  | 
| --- |
| AWS Glue コンソールの更新が行われました。コンソールの現行バージョンでは、データベースリソースリンクはサポートされません。 | 

Data Catalog にはデータベースへの*リソースリンク*を含めることもできます。データベースリソースリンクは、ローカルデータベースまたは共有データベースへのリンクです。現在、AWS Lake Formation のみでリソースリンクを作成できます。データベースへのリソースリンクを作成した後、データベース名を使用する任意の場所で、リソースリンク名を使用できます。所有しているデータベースまたは共有しているデータベースとともに、データベースリソースリンクは `glue:GetDatabases()` から返され、AWS Glue コンソールの [**Databases**] (データベース) ページにエントリとして表示されます。

Data Catalog には、テーブルリソースリンクを含めることもできます。

リソースリンクの詳細については、*AWS Lake Formation デベロッパーガイド*の「[Creating Resource Links](https://docs.aws.amazon.com/lake-formation/latest/dg/creating-resource-links.html)」を参照してください。

# テーブルの作成
<a name="tables-described"></a>

データストア内のデータのインベントリを作成するには、クローラーの実行が推奨されますが、メタデータテーブルを手動で AWS Glue Data Catalog に追加できます。このアプローチにより、メタデータ定義をより詳細にコントロールし、特定の要件に応じてカスタマイズできます。

以下の方法で、データカタログにテーブルを手動で追加することもできます。
+ AWS Glue コンソールを使用して AWS Glue Data Catalog に手動でテーブルを作成します。詳細については、「[コンソールを使用したテーブルの作成](#console-tables)」を参照してください。
+ [AWS Glue API](aws-glue-api.md) の `CreateTable` オペレーションを使用し、AWS Glue Data Catalog にテーブルを作成します。詳細については、「[CreateTable アクション (Python: create\$1table)](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-CreateTable)」を参照してください。
+ CloudFormation テンプレートを使用します。詳細については、「[AWS Glue 用の AWS CloudFormation](populate-with-cloudformation-templates.md)」を参照してください。

コンソールまたは API を使用して手動でテーブルを定義する場合、テーブルスキーマおよびデータソースでデータのタイプとフォーマットを示す分類フィールドの値を指定します、クローラーでテーブルを作成する場合、データ形式とスキーマは、組み込み分類子またはカスタム分類子のいずれかによって決定されます。AWS Glue コンソールを使用してテーブルを作成する方法の詳細については、[コンソールを使用したテーブルの作成](#console-tables) を参照してください。

**Topics**
+ [テーブルパーティション](#tables-partition)
+ [テーブルリソースリンク](#tables-resource-links)
+ [コンソールを使用したテーブルの作成](#console-tables)
+ [パーティションインデックスの作成](partition-indexes.md)
+ [クローラーを使用して手動で作成されたデータカタログテーブルを更新する](#update-manual-tables)
+ [Data Catalog テーブルのプロパティ](#table-properties)

## テーブルパーティション
<a name="tables-partition"></a>

Amazon Simple Storage Service (Amazon S3) フォルダの AWS Glue テーブル定義によって、パーティションテーブルを記述できます。たとえば、クエリのパフォーマンスを向上させるために、パーティションテーブルでは月の名前をキーとして毎月のデータを別のファイルに分割する場合があります。AWS Glue では、テーブル定義にテーブルのパーティションキーが含まれています。AWS Glue は、Amazon S3 フォルダのデータを評価してテーブルをカタログ化するとき、個々のテーブルまたはパーティション化されたテーブルを追加するかどうかを決定します。

テーブル内のすべてのパーティションをロードする代わりに、テーブル上にパーティションインデックスを作成して、パーティションのサブセットを取得できます。パーティションインデックスの使用方法については、「[パーティションインデックスの作成](partition-indexes.md)」を参照してください。

AWS Glue によって Amazon S3 フォルダのパーティションテーブルを作成するには、次の条件がすべて満たされている必要があります。
+ ファイルのスキーマは、AWS Glue によって決定されるものと似ている。
+ ファイルのデータ形式が同じである。
+ ファイルの圧縮形式が同じである。

例えば、iOS と Android 両方のアプリケーションの販売データを保存する `my-app-bucket` という名前の Amazon S3 バケットを所有しているとします。データは、年、月、日で分割されます。iOS および Android の販売に関するデータファイルは、同じスキーマ、データ形式、および圧縮形式です。AWS Glue Data Catalog では、AWS Glue クローラーが、年、月、日のパーティションキーを使用して 1 つのテーブル定義を作成します。

次の `my-app-bucket` の Amazon S3 リストでは、パーティションのいくつかが示されています。`=` シンボルは、パーティションキー値の割り当てに使用されます。

```
   my-app-bucket/Sales/year=2010/month=feb/day=1/iOS.csv
   my-app-bucket/Sales/year=2010/month=feb/day=1/Android.csv
   my-app-bucket/Sales/year=2010/month=feb/day=2/iOS.csv
   my-app-bucket/Sales/year=2010/month=feb/day=2/Android.csv
   ...
   my-app-bucket/Sales/year=2017/month=feb/day=4/iOS.csv
   my-app-bucket/Sales/year=2017/month=feb/day=4/Android.csv
```

## テーブルリソースリンク
<a name="tables-resource-links"></a>


|  | 
| --- |
| AWS Glue コンソールの更新が行われました。コンソールの現行バージョンでは、テーブルリソースリンクはサポートされません。 | 

Data Catalog には、テーブルへの*リソースリンク*を含めることができます。テーブルリソースリンクは、ローカルまたは共有テーブルへのリンクです。現在、AWS Lake Formation のみでリソースリンクを作成できます。テーブルへのリソースリンクを作成すると、テーブル名を使用する任意の場所で、リソースリンク名を使用できます。自分が所有している、または自分と共有しているテーブルに加えて、テーブルリソースリンクは `glue:GetTables()` から返され、AWS Glue コンソールの [**Tables**] (テーブル) ページにエントリとして表示されます。

Data Catalog には、データベースリソースリンクを含めることもできます。

リソースリンクの詳細については、「*AWS Lake Formation デベロッパーガイド*」の「[Creating Resource Links](https://docs.aws.amazon.com/lake-formation/latest/dg/creating-resource-links.html)」を参照してください。

## コンソールを使用したテーブルの作成
<a name="console-tables"></a>

AWS Glue Data Catalog のテーブルは、データストア内のデータを表すメタデータ定義です。クローラの実行時にテーブルを作成するか、または、AWS Glue コンソールで手動でテーブルを作成できます。** コンソールの [**TablesAWS Glue] (テーブル) リストに、テーブルのメタデータの値が表示されます。ETL (抽出、変換、ロード) ジョブを作成するときに、テーブル定義を使用してソースとターゲットを指定します。

**注記**  
AWS マネジメントコンソールの最新の変更に伴い、既存の IAM ロール を [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-SearchTables](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-SearchTables) 許可を持つように変更することが必要になる場合があります。新しいロールを作成する場合、`SearchTables` API 許可は既にデフォルトとして追加されています。

開始するには、AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。[**Tables**] (テーブル) タブをクリックし、[**Add tables**] (テーブルの追加) ボタンを使用して、クローラで、または属性を手動で入力してテーブルを作成します。

### コンソールでテーブルを追加する
<a name="console-tables-add"></a>

クローラを使用してテーブルを追加するには、[**Add tables**] (テーブルの追加)、[**Add tables using a crawler**] (クローラを使用してテーブルを追加) の順に選択します。次に、[**Add crawler**] (クローラの追加) ウィザードの手順に従います。クローラが実行されると、テーブルが AWS Glue Data Catalog に追加されます。詳細については、[クローラーを使用したデータカタログへの入力](add-crawler.md) を参照してください。

Data Catalog の Amazon Simple Storage Service (Amazon S3) テーブル定義の作成に必要な属性が分かっている場合は、テーブルウィザードで作成できます。[**Add tables**] (テーブルの追加)、[**Add table manually**] (手動でのテーブルを追加) の順に選択し、[**Add table**] (テーブルの追加) ウィザードの手順に従います。

コンソールで手動でテーブルを追加するときは、以下の点を考慮します。
+ Amazon Athena からテーブルにアクセスする場合は、英数字とアンダースコア文字のみを使用して名前を指定してください。詳細については、「[テーブル、データベース、および列の名前](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html#ate-table-database-and-column-names-allow-only-underscore-special-characters)」を参照してください。
+ ソースデータの場所は Amazon S3 パスにする必要があります。
+ データのデータ形式は、ウィザードに表示されているいずれかの形式と一致する必要があります。対応する分類、SerDe、およびその他のテーブルのプロパティは、選択された形式に基づいて自動的に入力されます。次の形式でテーブルを定義できます。  
**Avro**  
Apache Avro JSON バイナリ形式。  
**CSV**  
文字で区切られた値。また、区切り文字として、カンマ、パイプ、セミコロン、タブ、または Ctrl-A を指定します。  
**JSON**  
JavaScript Object Notation。  
**XML**  
Extensible Markup Language 形式。データの行を定義する XML タグを指定します。列は行のタグ内で定義されます。  
**Parquet**  
Apache Parquet 列指向ストレージ。  
**ORC**  
Optimized Row Columnar (ORC) ファイル形式。Hive データを効率的に保存するために設計された形式。
+ テーブルのパーティションキーを定義できます。
+ 現在、コンソールで作成した分割されたテーブルは、ETL ジョブで使用することはできません。

### テーブル属性
<a name="console-tables-attributes"></a>

以下に重要なテーブル属性を示します。

**名前**  
名前は、テーブルの作成時に決定され、変更することはできません。多くの AWS Glue オペレーションでテーブル名を参照します。

**データベース**  
テーブルが存在するコンテナオブジェクト。このオブジェクトには、AWS Glue Data Catalog 内に存在するテーブルの組織名が含まれ、データストアの組織名とは異なる場合があります。データベースを削除すると、データベースに含まれるすべてのテーブルも Data Catalog から削除されます。

**説明**  
テーブルの説明。テーブルの内容を理解しやすくするために説明を記入できます。

**テーブル形式**  
標準 AWS Glue テーブル、または Apache Iceberg 形式のテーブルの作成を指定します。  
データカタログには、テーブルストレージを管理し、Iceberg テーブルのクエリパフォーマンスを向上させるための次のテーブル最適化オプションが用意されています。  
+ **圧縮** – 古いデータを削除して、フラグメント化されたデータをより大規模で効率的なファイルに統合するために、データファイルはマージされ、書き換えられます。
+ **スナップショット保持** - スナップショットは、Iceberg テーブルのタイムスタンプ付きバージョンです。スナップショット保持設定を使用すると、スナップショットを保持する期間と保持するスナップショットの数を強制できます。スナップショット保持オプティマイザーを設定すると、古い不要なスナップショットと、その基になる関連付けられたファイルを削除して、ストレージのオーバーヘッドを管理できます。
+ **孤立ファイルの削除** — 孤立ファイルは、Iceberg テーブルメタデータによって参照されなくなったファイルです。これらのファイルは、特にテーブルの削除や ETL ジョブの失敗などのオペレーションの後、時間の経過と共に蓄積される可能性があります。孤立ファイルの削除を有効にすると、AWS Glue はこれらの不要なファイルを定期的に特定して削除できるため、ストレージが解放されます。
詳細については、「[Iceberg テーブルの最適化](table-optimizers.md)」を参照してください。

**最適化設定**  
デフォルト設定を使用するか、テーブルオプティマイザを有効にするための設定をカスタマイズできます。

**IAM ロール**  
 テーブル最適化を実行するために、サービスはユーザーに代わって IAM ロールを引き受けます。IAM ロールは、ドロップダウンを使用して選択できます。圧縮を有効にするために必要な許可がロールに付与されているようにしてください。  
IAM ロールに必要な許可の詳細については、「[テーブル最適化の前提条件](optimization-prerequisites.md)」を参照してください。

**場所**  
このテーブル定義が表すデータストア内のデータの場所へのポインタ。

**分類**  
テーブルの作成時に指定された分類の値。通常、これはクローラが実行されてソースデータの形式を指定するときに書き込まれます。

**最終更新日**  
Data Catalog でこのテーブルが更新された日付と時刻 (UTC)。

**追加された日付**  
Data Catalog にこのテーブルが追加された日付と時刻 (UTC)。

**非推奨**  
AWS Glue により、Data Catalog のテーブルは元のデータストアに存在しなくなったことが分かると、そのテーブルは廃止されたとしてデータカタログにマークされます。廃止されたテーブルを参照するジョブを実行する場合、ジョブは失敗する可能性があります。廃止されたテーブルを参照するジョブを編集し、ソースおよびターゲットとして削除します。廃止されたテーブルが不要になったら削除することをお勧めします。

**接続**  
AWS Glue でデータストアへの接続が必要な場合は、接続の名前がテーブルに関連付けられます。

### テーブルの詳細の表示と管理
<a name="console-tables-details"></a>

既存のテーブルの詳細を表示するには、リスト内のテーブル名を選択し、[**Action, View details**] (アクション、詳細を表示) を選択します。

テーブルの詳細にはテーブルのプロパティとスキーマが含まれます。このビューには、テーブルに定義された順序の列名、データ型、およびパーティションのキー列を含む、テーブルのスキーマが表示されます。列が複合型の場合は、以下の例に示すように、[**View properties**] (プロパティの表示) を選択して、そのフィールドの構造の詳細を表示します。

```
{
"StorageDescriptor": 
    {
      "cols": {
         "FieldSchema": [
           {
             "name": "primary-1",
             "type": "CHAR",
             "comment": ""
           },
           {
             "name": "second ",
             "type": "STRING",
             "comment": ""
           }
         ]
      },
      "location": "s3://aws-logs-111122223333-us-east-1",
      "inputFormat": "",
      "outputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
      "compressed": "false", 
      "numBuckets": "0",
      "SerDeInfo": {
           "name": "",
           "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
           "parameters": {
               "separatorChar": "|"
            }
      },
      "bucketCols": [],
      "sortCols": [],
      "parameters": {},
      "SkewedInfo": {},
      "storedAsSubDirectories": "false"
    },
    "parameters": {
       "classification": "csv"
    }
}
```

`StorageDescriptor` などのテーブルのプロパティの詳細については、「[StorageDescriptor 構造](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-StorageDescriptor)」を参照してください。

テーブルのスキーマを変更するには、[**Edit schema**] (スキーマの編集) を選択し、列の追加および削除、列名の変更、データ型の変更をします。

 スキーマを含め、テーブルの異なるバージョンを比較するには、[**Compare versions**] (バージョンの比較) を選択し、テーブルの 2 つのバージョンのスキーマを並べて比較します。詳細については、「[テーブルスキーマのバージョンの比較](#console-tables-schema-comparison)」を参照してください。

Amazon S3 パーティションを構成するファイルを表示するには、[**View partition**] (パーティションの表示) を選択します。Amazon S3 のテーブルでは、[**Key**] (キー) 列に、ソースデータストアでテーブルを分割するために使用されるパーティションキーが表示されます。パーティションは、日付、場所、または部門などのキー列の値に基づいて、テーブルを関連する部分に分割する方法です。パーティションの詳細については、インターネットで「hive パーティション」を検索してください。

**注記**  
テーブルの詳細を表示するための詳細な手順については、コンソールの [**Explore table**] (テーブルの確認) チュートリアルを参照してください。

### テーブルスキーマのバージョンの比較
<a name="console-tables-schema-comparison"></a>

 テーブルスキーマの 2 つのバージョンを比較する場合、展開・折りたたみによってネストされた行の変更点を比較、2 つのバージョンのスキーマを並べて比較、テーブルプロパティを並べて表示、などが行えます。

 バージョンの比較方法 

1.  AWS Glue コンソールから **[テーブル]** > **[アクション]** の順に選択し、**[バージョンの比較]** を選択します。  
![\[このスクリーンショットは、[アクション] ボタンの選択時を示しています。ドロップダウンメニューに [バージョンの比較] オプションが表示されます。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/catalog-table-compare-versions.png)

1.  バージョンのドロップダウンメニューから、比較するバージョンを選択します。スキーマを比較すると、[スキーマ] タブがオレンジ色で強調表示されます。

1.  2 つのバージョン間でテーブルを比較すると、テーブルスキーマが画面の左側と右側に表示されます。列名、データ型、キー、コメントの各フィールドを並べて比較することで、変更点を視覚的に判断できます。変更があると、色付きのアイコンでその変更の種類が表示されます。
   +  削除済み — 赤いアイコンによる表示は、以前のバージョンのテーブルスキーマから列が削除されたことを示します。
   +  編集済みまたは移動済み — 青いアイコンによる表示は、新しいバージョンのテーブルスキーマで列が変更または移動されたことを示します。
   +  追加 — 緑色のアイコンによる表示は、新しいバージョンのテーブルスキーマに列が追加されたことを示します。
   +  ネストされた変更 — 黄色のアイコンによる表示は、ネストされた列に変更が含まれていることを示します。列を選択して展開すると、削除、編集、移動、追加のいずれかが実行された列が表示されます。  
![\[このスクリーンショットは、2 つのバージョン間のテーブルスキーマの比較を示しています。左側は古いバージョンです。右側は新しいバージョンです。列の横にある削除アイコンは、古いバージョンから削除されたため、新しいバージョンでは表示されていません。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/catalog-table-version-comparison.png)

1.  検索バーのフィルタフィールドを使用すると、ここに入力した文字に基づいてフィールドを表示できます。いずれかのテーブルバージョンで列名を入力すると、フィルタリングされたフィールドが両方のテーブルバージョンに表示され、変更が行われた箇所がわかります。

1.  プロパティを比較するには、**[プロパティ]** タブを選択します。

1.  バージョンの比較を停止するには、**[比較の停止]** を選択してテーブルのリストに戻ります。

# パーティションインデックスの作成
<a name="partition-indexes"></a>

時間の経過とともに、数十万のパーティションがテーブルに追加されます。[GetPartitions API](https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html) は、テーブル内のパーティションをフェッチするために使用されます。この API は、リクエストで指定された式と一致するパーティションを返します。

「国」、「カテゴリ」、「年」、「月」、「creationDate」のキーで分割された例として、sales\$1data テーブルを参考にします。2020 年の 2020 年 8 月 15 日以降に「書籍」のカテゴリで販売されたアイテムの売り上げデータを取得する場合、Data Catalog に「Category = 'Books' and creationDate > '2020-08-15'」という式で `GetPartitions` リクエストを行います。

テーブルにパーティションインデックスが存在しない場合、AWS Glue では、テーブルのすべてのパーティションがロードされ、`GetPartitions` リクエストでユーザーが指定したクエリ式を使用してロードされたパーティションがフィルタリングされます。インデックスのないテーブルでパーティション数が増えると、クエリの実行に時間がかかります。インデックスを使用すると、`GetPartitions` クエリでは、テーブル内のすべてのパーティションをロードするのではなく、パーティションのサブセットを取得しようとします。

**Topics**
+ [パーティションインデックスについて](#partition-index-1)
+ [パーティションインデックスを持つテーブルの作成](#partition-index-creating-table)
+ [パーティションインデックスの既存テーブルへの追加](#partition-index-existing-table)
+ [テーブル上のパーティションインデックスの説明](#partition-index-describing)
+ [パーティションインデックスの使用に関する制限事項](#partition-index-limitations)
+ [GetPartitions 呼び出しを最適化するためのインデックスの使用](#partition-index-getpartitions)
+ [エンジンとの統合](#partition-index-integration-engines)

## パーティションインデックスについて
<a name="partition-index-1"></a>

パーティションインデックスを作成する際、指定したテーブルに既に存在するパーティションキーのリストを指定します。パーティションインデックスは、テーブルで定義されているパーティションキーのサブリストです。パーティションインデックスは、テーブルで定義されたパーティションキーを任意の順序にして作成できます。上記の sales\$1data テーブルでは、可能なインデックスには (国、カテゴリ、creationDate)、(国、カテゴリ、年)、(国、カテゴリ)、(国)、(カテゴリ、国、年、月) などがあります。

Data Catalog は、インデックスの作成時に指定された順序でパーティション値を連結します。インデックスは、テーブルに追加されたパーティションと整合して構築されます。インデックスは文字列 (string、char、varchar)、数値 (int、bigint、long、tinyint、smallint)、日付 (yyyy-MM-dd) の列タイプに対して作成できます。

**サポートされているデータ型**
+ Date – `YYYY-MM-DD` などの ISO 形式の日付。たとえば、`2020-08-15` の日付。この形式では、ハイフン (‐) を使用して年、月、日を区切ります。インデックス用の日付の許容範囲は、`0000-01-01` から `9999-12-31` までです。
+ String – 一重引用符または二重引用符で囲まれた文字列リテラルです。
+ Char – char(10) など、1 から 255 までの指定された長さを持つ固定長の文字データです。
+ Varchar – varchar(10) など、1 から 65535 までの指定された長さを持つ可変長の文字データです。
+ Numeric — int、bigint、long、tinyint、smallint

「Numeric」、「String」、「Date」データ型のインデックスは、=、>、>=、<、<=、演算子間をサポートします。インデックス作成ソリューションは現在、`AND` 論理演算子のみをサポートしています。「LIKE」、「IN」、「OR」、および「NOT」の演算子のある部分式は、インデックスを使用してフィルタリングする場合、この式では無視されます。無視された部分式のフィルタリングは、インデックスフィルタリングを適用した後にフェッチされたパーティションに対して行われます。

テーブルに追加されたパーティションごとに、対応するインデックス項目が作成されます。「n」個のパーティションを持つテーブルの場合、1 つのパーティションインデックスは「n」個のパーティションインデックス項目になります。同じテーブルの「m」個のパーティションインデックスは、「m\$1n」個のパーティションインデックス項目になります。各パーティションインデックス項目は、現在のデータカタログストレージの AWS Glue 料金ポリシーに従って課金されます。ストレージオブジェクトの料金の詳細については、「[AWS Glue の料金](https://aws.amazon.com/glue/pricing/)」を参照してください。

## パーティションインデックスを持つテーブルの作成
<a name="partition-index-creating-table"></a>

テーブルの作成中にパーティションインデックスを作成できます。`CreateTable` リクエストは、[`PartitionIndex` オブジェクト](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-PartitionIndex)のリストを入力として指定します。1 つのテーブルには、最大 3 つのパーティションインデックスを作成できます。各パーティションインデックスには、テーブルに対して定義された名前と `partitionKeys` のリストが必要です。テーブル上に作成されたインデックスは、[`GetPartitionIndexes` API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-GetPartitionIndexes) を使用してフェッチできます。

## パーティションインデックスの既存テーブルへの追加
<a name="partition-index-existing-table"></a>

既存のテーブルにパーティションインデックスを追加するには、`CreatePartitionIndex` オペレーションを使用します。`CreatePartitionIndex` オペレーションごとに、1 つの `PartitionIndex` を作成できます。インデックスを追加しても、テーブルの可用性には影響しません。これは、インデックスの作成中もテーブルが使用可能になるためです。

追加されたパーティションのインデックスステータスが CREATING に設定され、インデックスデータの作成が開始されます。インデックスの作成プロセスが正常に終了すると、indexStatus は ACTIVE に更新され、プロセスが正常に終了しなかった場合、インデックスステータスは FAILED に更新されます。インデックスが作成できない理由は、複数あり得ます。`GetPartitionIndexes` オペレーションを使用して、障害の詳細を取得できます。考えられる障害は次のとおりです。
+ ENCRYPTED\$1PARTITION\$1ERROR – 暗号化されたパーティションを持つテーブルでのインデックスの作成はサポートされていません。
+ INVALID\$1PARTITION\$1TYPE\$1DATA\$1ERROR – `partitionKey` の値が対応する `partitionKey` データ型に対して有効な値でない場合に発生します。例えば、「int」データ型の `partitionKey` の値が「foo」の場合などです。
+ MISSING\$1PARTITION\$1VALUE\$1ERROR – `indexedKey` の `partitionValue` がない場合に発生します。これは、テーブルのパーティション化に整合性がない場合に発生します。
+ UNSUPPORTED\$1PARTITION\$1CHARACTER\$1ERROR – インデックス付きパーティションキーの値に「\$1u0000」、「\$1u0001」、または「\$1u0002」という文字が含まれている場合に発生します。
+ INTERNAL\$1ERROR – インデックスの作成中に内部エラーが発生しました。

## テーブル上のパーティションインデックスの説明
<a name="partition-index-describing"></a>

テーブル上に作成されたパーティションインデックスを取得するには、`GetPartitionIndexes` オペレーションを使用します。レスポンスとして、テーブル上のすべてのインデックスと、各インデックスの現在のステータス (`IndexStatus`) が返ります。

パーティションインデックスの `IndexStatus` は、次のいずれかになります。
+ `CREATING` – インデックスは現在作成されていますが、まだ使用することはできません。
+ `ACTIVE` – インデックスは、すぐに使用できます。リクエストにインデックスを使用して最適化されたクエリを実行できます。
+ `DELETING` – インデックスは現在削除されているため、使用できなくなっています。アクティブ状態のインデックスは、`DeletePartitionIndex` リクエストを使用してステータスを ACTIVE から DELETING に移行することによって削除できます。
+ `FAILED` – 既存のテーブルでインデックスの作成に失敗しました。失敗したインデックスは、直近の 10 個まで各テーブルに保存されます。

既存のテーブルで作成されたインデックスには、次のような状態遷移があり得ます。
+ CREATING → ACTIVE → DELETING
+ CREATING → FAILED

## パーティションインデックスの使用に関する制限事項
<a name="partition-index-limitations"></a>

パーティションインデックスを作成したら、テーブルとパーティションの機能に対する次の変更点に注意してください。

**新規パーティションの作成 (インデックス追加後)**  
テーブルにパーティションインデックスが作成されると、テーブルに追加されたすべての新しいパーティションは、インデックス付きキーのデータ型チェックのために検証されます。インデックス付きキーのパーティション値は、データ型形式について検証されます。データ型のチェックが失敗すると、パーティションの作成操作は失敗します。*sales\$1data* テーブルに対して、キー (カテゴリ、年) のインデックスが作成され、カテゴリの型が `string`、年の型が `int` の場合、YEAR の値が「foo」であれば、新しいパーティションの作成は失敗します。

インデックスを有効にすると、U\$10000、U\$100001、U\$10002 という文字を含むインデックス付きキー値のパーティションの追加が失敗するようになります。

**テーブルの更新**  
テーブル上にパーティションインデックスを作成すると、既存のパーティションキーのパーティションキー名を変更することはできません。また、インデックスに登録されているキーのタイプまたは順序を変更することはできません。

## GetPartitions 呼び出しを最適化するためのインデックスの使用
<a name="partition-index-getpartitions"></a>

インデックス付きテーブルで `GetPartitions` を呼び出すとき、式を含めることができます。また、適用可能な場合は、Data Catalogで、可能であればインデックスが使用されます。インデックスの最初のキーは、フィルタリングに使用されるインデックスの式に含めて渡す必要があります。フィルタリングのインデックスの最適化は、ベストエフォートとして適用されます。Data Catalog では、可能な限りインデックスの最適化を使用しようとしますが、インデックスが見つからない場合、またはサポートされていない演算子の場合は、すべてのパーティションをロードする既存の実装に戻します。

上記の *sales\$1data* テーブルには、[Country, Category, Year] (国、カテゴリ、年) のインデックスを追加できます。式に「Country」が渡されない場合、登録されたインデックスは、インデックスを使用したパーティションのフィルタリングができません。最大 3 つのインデックスを追加して、さまざまなクエリパターンをサポートできます。

いくつかの式を例に取り、そこでインデックスが機能する様子を示します。


| 表現 | インデックスの使用方法 | 
| --- | --- | 
|  Country = 'US'  |  インデックスは、パーティションをフィルタリングするために使用されます。  | 
|  Country = 'US' and Category = 'Shoes'  |  インデックスは、パーティションをフィルタリングするために使用されます。  | 
|  Category = 'Shoes'  |  式に「country」が指定されていないため、インデックスは使用されません。レスポンスを返すため、すべてのパーティションがロードされます。  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018'  |  インデックスは、パーティションをフィルタリングするために使用されます。  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018' and month = 2  |  インデックスを使用して、「country = "US" and category = "shoes" and year > 2018」に該当するすべてのパーティションがフェッチされます。その後、月に関する式によるフィルタリングが実行されます。  | 
|  Country = 'US' AND Category = 'Shoes' OR Year > '2018'  |  `OR` 演算子が式に存在するため、インデックスは使用されません。  | 
|  Country = 'US' AND Category = 'Shoes' AND (Year = 2017 OR Year = '2018')  |  インデックスを使用して、「country = "US" and category = "shoes"」に該当するのすべてのパーティションがフェッチされ、その後、年に関する式によるフィルタリングが実行されます。  | 
|  Country in ('US', 'UK') AND Category = 'Shoes'  |  `IN` 演算子は現在サポートされていないため、インデックスはフィルタリングに使用されません。  | 
|  Country = 'US' AND Category in ('Shoes', 'Books')  |  インデックスを使用して、「country = "US"」に該当するのすべてのパーティションが取得され、その後、カテゴリに関する式によるフィルタリングが実行されます。  | 
|  Country = 'US' AND Category in ('Shoes', 'Books') AND (creationDate > '2023-9-01'  |  「creationDate > '2023-9-01'」に設定し、インデックスを使用して「country = "US"」に該当するすべてのパーティションをフェッチしたら、カテゴリの式にフィルタリングが実行されます。  | 

## エンジンとの統合
<a name="partition-index-integration-engines"></a>

Redshift Spectrum、Amazon EMR、および AWS Glue ETL Spark DataFrames は、インデックスが AWS Glue で ACTIVE 状態になった後にパーティションを取得するためにインデックスを利用できます。[Athena](https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#glue-best-practices-partition-index) と [AWS Glue ETL DynamicFrame](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-cat-predicates) では、クエリを向上させるためにインデックスを利用するには追加のステップに従う必要があります。

### パーティションのフィルタリングの有効化
<a name="enable-partition-filtering-athena"></a>

Athena でパーティションフィルタリングを有効にするには、テーブルのプロパティを次のように更新する必要があります。

1. AWS Glue コンソールで、**[データカタログ]** の **[テーブル]** を選択します。

1. テーブルを選択します。

1. **[アクション]** で **[テーブルの編集]** を選択します。

1. **[テーブルのプロパティ]** で、次の内容を追加します。
   + キー – `partition_filtering.enabled`
   + 値 – `true`

1. **[Apply]** (適用) を選択します。

または、Athena で [ALTER TABLE SET PROPERTIES](https://docs.aws.amazon.com/athena/latest/ug/alter-table-set-tblproperties.html) クエリを実行してこのパラメータを設定することもできます。

```
ALTER TABLE partition_index.table_with_index
SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')
```

## クローラーを使用して手動で作成されたデータカタログテーブルを更新する
<a name="update-manual-tables"></a>

手動で AWS Glue Data Catalog テーブルを作成し、AWS Glue クローラーを使用して更新された状態を維持することもできます。スケジュールで実行されているクローラーは、新しいパーティションを追加して、スキーマの変更によりテーブルを更新できます。これは Apache Hive メタストアから移行されたテーブルにも適用されます。

これを行うには、クローラーを定義するときに、1 つ以上のデータストアをクロールのソースとして指定する代わりに、既存のデータカタログテーブルを 1 つ以上指定します。クローラーは、カタログテーブルで指定されたデータストアをクロールします。この場合、新しいテーブルは作成されず、手動で作成されたテーブルが更新されます。

以下に、カタログテーブルを手動で作成し、クローラーソースとしてカタログテーブルを指定するその他の理由を示します。
+ カタログテーブル名命名アルゴリズムに依存せず、カタログテーブル名を選択することをお勧めします。
+ パーティションの検出を中断する可能性がある形式のファイルが誤ってデータソースパスに保存されないように、新しいテーブルが作成されないようにする必要があります。

詳細については、「[ステップ 2: データソースと分類子を選択する](define-crawler-choose-data-sources.md)」を参照してください。

## Data Catalog テーブルのプロパティ
<a name="table-properties"></a>

 AWS CLI で知られているテーブルのプロパティ、つまりパラメータは無効なキーと値の文字列です。AWS Glue の外部での Data Catalog の使用をサポートする場合は、テーブルに独自のプロパティを設定します。この操作は、Data Catalog を使用する他のサービスでも行うことができます。AWS Glue がジョブまたはクローラーの実行時に一部のテーブルプロパティを設定します。特に説明がない限り、これらのプロパティは内部使用のためのものであり、現在の形式での存続や、これらのプロパティを手動で変更した場合の製品の動作についてはサポートされません。

 AWS Glue クローラーで設定できるテーブルプロパティの詳細については、「[クローラーによって設定されたデータカタログテーブルのパラメータ](table-properties-crawler.md)」を参照してください。