

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

# でのオブジェクトの作成 AWS Glue Data Catalog
<a name="populating-catalog"></a>

AWS Lake Formation は AWS Glue Data Catalog (データカタログ) を使用して、データレイク、データソース、変換、ターゲットに関するメタデータを保存します。メタデータは、データセット内の基になるデータに関するデータです。各 AWS アカウントには、 AWS リージョンごとに 1 つのデータカタログがあります。

データカタログ内のメタデータは、カタログ、データベース、テーブルで構成される 3 レベルのデータ階層に分類されます。さまざまなソースからのデータをカタログと呼ばれる論理コンテナにまとめます。各カタログは、Amazon Redshift データウェアハウス、 Amazon DynamoDB データベース、および Snowflake、MySQL の他 30 を超える外部データソースを含むサードパーティーデータソースソースなどのソースからのデータを表し、これらはフェデレーティッドコネクタを介して統合されています。データカタログに新しいカタログを作成して、S3 テーブルバケットまたは Redshift マネージドストレージ (RMS) にデータを保存することもできます。

テーブルには、スキーマ情報、パーティション情報、およびデータロケーションなどの基盤となるデータに関する情報が保存されます。データベースはテーブルのコレクションです。データカタログには、リソースリンクも含まれています。これは、外部アカウントで共有されるカタログ、データベース、テーブルへのリンクで、データレイク内のデータへのクロスアカウントアクセスに使用されます。

データカタログは、カタログ、データベース、テーブルを含むネストされたカタログオブジェクトです。これは AWS アカウント ID によって参照され、アカウントと のデフォルトカタログです AWS リージョン。データカタログは、3 レベルの階層 (catalog.database.table) を使用してテーブルを整理します。
+ カタログ – データカタログの 3 つのレベルのメタデータ階層の最上位レベル。フェデレーションを利用して、データカタログに複数のカタログを追加できます。
+ データベース – テーブルとビューで構成されるメタデータ階層の 2 番目のレベル。データベースは、Amazon Redshift や Trino などの多くのデータシステムではスキーマとも呼ばれます。
+ テーブルとビュー – データカタログの 3 レベルデータ階層の 3 番目のレベル。

Amazon S3 内のすべての Iceberg テーブルは、カタログ ID = AWS アカウント ID を持つデフォルトのデータカタログに保存されます。フェデレーションを通じて、Amazon Redshift、Amazon S3 Table ストレージ、またはその他のサードパーティーデータソースにテーブルの定義 AWS Glue Data Catalog を保存するフェデレーションカタログを に作成できます。

**Topics**
+ [カタログの作成](creating-catalog.md)
+ [データベースを作成する](creating-database.md)
+ [テーブルの作成](creating-tables.md)
+ [AWS Glue Data Catalog ビューの構築](working-with-views.md)

# カタログの作成
<a name="creating-catalog"></a>

カタログは、 AWS Glue Data Catalogの 3 レベルのメタデータ階層の最上位レベルを表します。複数の方式を使用して、データをデータカタログに取り込み、マルチレベルカタログを作成できます。

 外部データソースからカタログを作成する方法の詳細については、「[へのデータの取り込み AWS Glue Data Catalog](bring-your-data-overview.md)」を参照してください。

 Lake Formation コンソールを使用してカタログを作成するには、データレイク管理者、または*カタログ作成者*としてサインインしている必要があります。カタログ作成者は、Lake Formation の `CREATE_CATALOG` アクセス許可を付与されているプリンシパルです。カタログ作成者のリストは、Lake Formation コンソールの **[管理ロールとタスク]** ページで確認することができます。このリストを表示するには、`lakeformation:ListPermissions` IAM 許可があり、データレイク管理者、または `CREATE_CATALOG` アクセス許可に対する付与オプションを持つカタログ作成者としてサインインしている必要があります。

# データベースを作成する
<a name="creating-database"></a>

Data Catalog のメタデータテーブルは、データベース内に保存されます。データベースは必要な数だけ作成でき、データベースごとに異なる Lake Formation 許可を付与できます。

データベースは、オプションのロケーションプロパティを持つことができます。通常、このロケーションは Lake Formation に登録されている Amazon Simple Storage Service (Amazon S3) ロケーション内にあります。ロケーションを指定するときは、プリンシパルに、データベースロケーション内のロケーションをポイントする Data Catalog テーブルを作成するためのデータロケーション許可は必要ありません。詳細については、「[Underlying data access control](access-control-underlying-data.md#data-location-permissions)」を参照してください。

Lake Formation コンソールを使用してデータベースを作成するには、データレイク管理者、または*データベース作成者*としてサインインしている必要があります。データベース作成者は、Lake Formation の `CREATE_DATABASE` 許可を付与されたプリンシパルです。データベース作成者のリストは、Lake Formation コンソールの **[Administrative roles and tasks]** (管理ロールとタスク) ページで確認することができます。このリストを表示するには、`lakeformation:ListPermissions` IAM 許可を持っており、データレイク管理者、または `CREATE_DATABASE` 許可に対する grant オプションを持つデータベース作成者としてサインインしている必要があります。

**データベースを作成する**

1. [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) で AWS Lake Formation コンソールを開き、データレイク管理者またはデータベース作成者としてサインインします。

1. ナビゲーションペインの **[Data catalog]** で **[Databases]** (データベース) を選択します。

1. **[Create database]** (データベースを作成) を選択します。

1. **[Create database]** (データベースの作成) ダイアログボックスで、データベース名、オプションのロケーション、およびオプションの説明を入力します。

1. オプションで、**[Use only IAM access control for new tables in this database]** (このデータベース内の新しいテーブルには IAM アクセス制御のみを使用する) を選択します。

   このオプションについては、「[データレイクのデフォルト設定の変更](change-settings.md)」を参照してください。

1. **[Create database]** (データベースを作成) を選択します。

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

AWS Lake Formation メタデータテーブルには、スキーマ情報、パーティション情報、データの場所など、データレイク内のデータに関する情報が含まれています。これらのテーブルは、AWS Glue Data Catalog に保存されます。これらは、データレイクにある基盤となるデータにアクセスし、Lake Formation 許可でそのデータを管理するために使用します。テーブルは、Data Catalog 内のデータベースに保存されます。

Data Catalog テーブルを作成するには、いくつかの方法があります。
+ AWS Glue でクローラを実行する。「*AWS Glue デベロッパーガイド*」の「[クローラの定義](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)」を参照してください。
+ ワークフローを作成して実行する。「[Lake Formation でのワークフローを使用したデータのインポート](workflows.md)」を参照してください。
+ Lake Formation コンソール、AWS Glue API、または AWS Command Line Interface (AWS CLI) を使用して、テーブルを手動で作成する。
+ を使用してテーブルを作成します Amazon Athena。
+ 外部アカウント内のテーブルへのリソースリンクを作成する。「[リソースリンクの作成](creating-resource-links.md)」を参照してください。

# Apache Iceberg テーブルの作成
<a name="creating-iceberg-tables"></a>

 AWS Lake Formation は、Amazon S3 に AWS Glue Data Catalog データが存在する で Apache Parquet データ形式を使用する Apache Iceberg テーブルの作成をサポートしています。Data Catalog のテーブルは、データストア内のデータを表すメタデータ定義です。デフォルトでは、Lake Formation は Iceberg v2 テーブルを作成します。v1 テーブルと v2 テーブルの違いについては、Apache Iceberg ドキュメントの「[形式バージョンの変更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)」を参照してください。

 [Apache Iceberg](https://iceberg.apache.org/) は、非常に大規模な分析データセット用のオープンテーブル形式です。Iceberg では、スキーマの変更 (スキーマ進化とも呼ばれます) を簡単に行うことができます。つまり、基になるデータを中断することなく、データテーブルの列を追加、名前変更、または削除できます。Iceberg はデータのバージョニングもサポートしているため、データの変更を経時的に追跡できます。これにより、タイムトラベル機能が有効になるため、過去のバージョンのデータにアクセスしてクエリを実行し、更新と削除の間に行われたデータの変更を分析できます。

Lake Formation コンソールまたは AWS Glue API の `CreateTable`オペレーションを使用して、データカタログに Iceberg テーブルを作成できます。詳細については、「[CreateTable アクション (Python: create\$1table)](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-CreateTable)」を参照してください。

Data Catalog に Iceberg テーブルを作成する場合、読み取りと書き込みを実行できるように、Amazon S3 でテーブル形式とメタデータファイルのパスを指定する必要があります。

 Lake Formation を使用して、Amazon S3 データロケーションの登録時にきめ細かなアクセスコントロール許可を使用して Iceberg テーブルを保護できます AWS Lake Formation。Amazon S3 のソースデータおよび Lake Formation に登録されていないメタデータの場合、アクセスは Amazon S3 および AWS Glue アクションの IAM アクセス許可ポリシーによって決まります。詳細については、「[Lake Formation 許可の管理](managing-permissions.md)」を参照してください。

**注記**  
Data Catalog は、パーティションの作成と Iceberg テーブルプロパティの追加をサポートしていません。

**Topics**
+ [前提条件](#iceberg-prerequisites)
+ [Iceberg テーブルの作成](#create-iceberg-table)

## 前提条件
<a name="iceberg-prerequisites"></a>

 Data Catalog に Iceberg テーブルを作成し、Lake Formation のデータアクセス許可を設定するには、次の要件を満たす必要があります。

1. 

**Lake Formation にデータが登録されていない状態で Iceberg テーブルを作成するために必要なアクセス許可。**

   Data Catalog にテーブルを作成するために必要なアクセス許可に加えて、テーブル作成者には次のアクセス許可が必要です。
   + リソース arn:aws:s3:::\$1bucketName\$1 での `s3:PutObject`
   + リソース arn:aws:s3:::\$1bucketName\$1 での `s3:GetObject`
   + リソース arn:aws:s3:::\$1bucketName\$1 での `s3:DeleteObject`

1. 

**Lake Formation にデータが登録されている状態で Iceberg テーブルを作成するために必要なアクセス許可:**

   Lake Formation を使用してデータレイク内のデータを管理および保護するには、テーブルのデータを含む Amazon S3 ロケーションを Lake Formation に登録します。これは、Lake Formation が Athena、Redshift Spectrum、Amazon EMR などの AWS 分析サービスに認証情報を提供してデータにアクセスできるようにするためです。Amazon S3 ロケーションの登録の詳細については「[データレイクへの Amazon S3 ロケーションの追加](register-data-lake.md)」を参照してください。

   Lake Formation に登録されている、基盤となるデータを読み書きするプリンシパルには、次のアクセス許可が必要です。
   + `lakeformation:GetDataAccess`
   + `DATA_LOCATION_ACCESS`

     ロケーションに対するデータロケーション許可を持つプリンシパルは、すべての子ロケーションに対するロケーション許可も持っています。

     データロケーション許可の詳細については、「[基盤となるデータのアクセスコントロール](access-control-underlying-data.md)」を参照してください。

 圧縮を有効にするには、Data Catalog 内のテーブルを更新するアクセス許可を持つ IAM ロールを、サービスが引き受ける必要があります。詳細については、「[テーブル最適化の前提条件](https://docs.aws.amazon.com/glue/latest/dg/optimization-prerequisites.html)」を参照してください。

## Iceberg テーブルの作成
<a name="create-iceberg-table"></a>

このページに記載されている AWS Command Line Interface ように、Lake Formation コンソールまたは を使用して Iceberg v1 および v2 テーブルを作成できます。 AWS Glue コンソールまたは を使用して Iceberg テーブルを作成することもできます AWS Glue クローラー。詳細については、「 AWS Glue デベロッパーガイド」の「[Data Catalog とクローラー](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)」を参照してください。

**Iceberg テーブルを作成するには**

------
#### [ Console ]

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

1. Data Catalog で **[テーブル]** を選択し、**[テーブルの作成]** ボタンを使用して次の属性を指定します。
   + **テーブル名**: テーブルの名前を入力します。Athena を使用してテーブルにアクセスする場合は、「Amazon Athena ユーザーガイド」の[命名に関するヒント](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html)を使用します。
   + **データベース**: 既存のデータベースを選択するか、新しいデータベースを作成します。
   + **説明**: テーブルの説明。テーブルの内容を理解しやすくするために説明を記入できます。
   + **テーブル形式**: **[テーブル形式]** として、[Apache Iceberg] を選択します。  
![\[Apache Iceberg テーブルオプションの選択とテーブル最適化オプション。\]](http://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/images/table-optimization.png)
   + **テーブル最適化**
     + **圧縮** - データファイルをマージして書き換えて、古くなったデータを削除し、断片化されたデータをより大きい効率的なファイルに統合します。
     + **スナップショット保持** - スナップショットは、Iceberg テーブルのタイムスタンプ付きバージョンです。スナップショット保持設定を使用すると、スナップショットを保持する期間と保持するスナップショットの数を強制できます。スナップショット保持オプティマイザーを設定すると、古い不要なスナップショットと、その基になる関連付けられたファイルを削除して、ストレージのオーバーヘッドを管理できます。
     + **孤立ファイルの削除** — 孤立ファイルは、Iceberg テーブルメタデータによって参照されなくなったファイルです。これらのファイルは、特にテーブルの削除や ETL ジョブの失敗などのオペレーションの後、時間の経過と共に蓄積される可能性があります。孤立ファイルの削除を有効にすると AWS Glue 、 はこれらの不要なファイルを定期的に識別して削除し、ストレージを解放できます。

     詳細については、「[Iceberg テーブルの最適化](https://docs.aws.amazon.com/glue/latest/dg/table-optimizers.html)」を参照してください。
   + **IAM ロール**: 圧縮を実行する場合、サービスはユーザーに代わって IAM ロールを引き受けます。IAM ロールは、ドロップダウンを使用して選択できます。圧縮を有効にするために必要なアクセス許可がロールにあることを確認します。

     必要なアクセス許可の詳細については、「[テーブル最適化の前提条件](https://docs.aws.amazon.com/glue/latest/dg/optimization-prerequisites.html)」を参照してください。
   + **ロケーション**: メタデータテーブルを保存する Amazon S3 内のフォルダへのパスを指定します。Iceberg が読み取りと書き込みを実行するには、メタデータファイルと Data Catalog 内のロケーションが必要です。
   + **スキーマ**: **[列を追加]** を選択して、列と、列のデータ型を追加します。空のテーブルを作成して、後でスキーマを更新することもできます。Data Catalog は Hive データ型をサポートしています。詳細については、「[Hive データ型](https://cwiki.apache.org/confluence/plugins/servlet/mobile?contentId=27838462#content/view/27838462)」を参照してください。

      Iceberg では、テーブルを作成した後でスキーマとパーティションを進化させることができます。[[Athena クエリ]](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-evolving-table-schema.html) を使用してテーブルスキーマを更新し、[[Spark クエリ]](https://iceberg.apache.org/docs/latest/spark-ddl/#alter-table-sql-extensions) を使用してパーティションを更新できます。

------
#### [ AWS CLI ]

```
aws glue create-table \
    --database-name iceberg-db \
    --region us-west-2 \
    --open-table-format-input '{
      "IcebergInput": { 
           "MetadataOperation": "CREATE",
           "Version": "2"
         }
      }' \
    --table-input '{"Name":"test-iceberg-input-demo",
            "TableType": "EXTERNAL_TABLE",
            "StorageDescriptor":{ 
               "Columns":[ 
                   {"Name":"col1", "Type":"int"}, 
                   {"Name":"col2", "Type":"int"}, 
                   {"Name":"col3", "Type":"string"}
                ], 
               "Location":"s3://DOC_EXAMPLE_BUCKET_ICEBERG/"
            }
        }'
```

------

# Iceberg テーブルの最適化
<a name="data-compaction"></a>

Lake Formation は、 AWS 分析エンジンと ETL ジョブで使用される Apache Iceberg テーブルの管理とパフォーマンスを向上させるために、複数のテーブル最適化オプションをサポートしています。これらのオプティマイザーは、効率的なストレージの使用量、クエリパフォーマンスの向上、効果的なデータ管理を実現します。Lake Formation では、次の 3 種類のテーブルオプティマイザーを使用できます。
+ **圧縮** - データ圧縮では、小さいデータファイルを圧縮してストレージの使用量を減らし、読み取りパフォーマンスを向上させます。古いデータを削除して、フラグメント化されたデータをより大規模で効率的なファイルに統合するために、データファイルはマージされ、書き換えられます。圧縮は、必要に応じて自動または手動でトリガーするように設定できます。
+ **スナップショット保持** - スナップショットは、Iceberg テーブルのタイムスタンプ付きバージョンです。スナップショット保持設定を使用すると、スナップショットを保持する期間と保持するスナップショットの数を強制できます。スナップショット保持オプティマイザーを設定すると、古い不要なスナップショットと、その基になる関連付けられたファイルを削除して、ストレージのオーバーヘッドを管理できます。
+ **孤立ファイルの削除** — 孤立ファイルは、Iceberg テーブルメタデータによって参照されなくなったファイルです。これらのファイルは、特にテーブルの削除や ETL ジョブの失敗などのオペレーションの後、時間の経過と共に蓄積される可能性があります。孤立ファイルの削除を有効にすると AWS Glue 、 はこれらの不要なファイルを定期的に識別して削除し、ストレージを解放できます。

 AWS Glue コンソール、または AWS Glue API オペレーションを使用して、データカタログ内の個々の Iceberg テーブルの圧縮 AWS CLI、スナップショット保持、孤立ファイル削除オプティマイザを有効または無効にできます。

詳細については、「 AWS Glue デベロッパーガイド」の[「Iceberg テーブルの最適化](https://docs.aws.amazon.com/glue/latest/dg/table-optimizers.html)」を参照してください。

# テーブルの検索
<a name="searching-for-tables"></a>

 AWS Lake Formation コンソールを使用して、名前、場所、データベースを含むデータカタログテーブルなどでデータカタログテーブルを検索できます。検索結果には、Lake Formation 許可を持つテーブルのみが表示されます。

**テーブルを検索する (コンソール)**

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

1. ナビゲーションペインで **[Table]** (テーブル) を選択します。

1. ページの上部にある検索フィールドにカーソルを置きます。このフィールドには、*[プロパティでテーブルを検索]* というプレースホルダテキストが表示されています。

   検索に使用できるさまざまなテーブルプロパティを示す **[Properties]** (プロパティ) メニューが表示されます。  
![\[検索フィールドから [Properties] (プロパティ) メニューがドロップダウンされます。これには、[Name] (名前)、[Classification] (分類)、[Database] (データベース)、[Location] (ロケーション)、[Catalog ID] (カタログ ID) のエントリが含まれています。\]](http://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/images/search-for-tables.png)

1. 以下のいずれかを実行します。
   + テーブルが含まれるデータベースで検索します。

     1. **[Properties]** (プロパティ) メニューから **[Databases]** (データベース) を選択し、表示される **[Databases]** (データベース) メニューからデータベースを選択するか、データベース名を入力して **[Enter]** キーを押します。

        データベースにある、許可を持っているテーブルがリストされます。

     1. (オプション) このリストをデータベース内の単一のテーブルに絞り込むには、もう 1 度検索フィールドにカーソルを置き、**[Properties]** (プロパティ) メニューから **[Name]** (名前) を選択して、表示される **[Tables]** (テーブル) メニューからテーブル名を選択するか、テーブル名を入力して **[Enter]** キーを押します。

        単一のテーブルがリストされ、検索フィールドの下にデータベース名とテーブル名の両方がタイルとして表示されます。  
![\[検索フィールドの下に、[Database] (データベース) とラベル付けされた、選択したデータベース名が含まれるタイルと、[Table] (テーブル) とラベル付けされた、選択したテーブル名が含まれるタイルの 2 つのタイルがあります。タイルの右側には、[Clear filter] (フィルターをクリア) ボタンがあります。\]](http://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/images/search-for-tables-with-filter.png)

        フィルターを調整するには、どちらかのタイルを閉じるか、**[Clear filter]** (フィルターをクリア) を選択します。
   + 他のプロパティで検索します。

     1. **[Properties]** (プロパティ) メニューから検索プロパティを選択します。

         AWS アカウント ID で検索するには、**プロパティ**メニューから**カタログ ID** を選択し、有効な AWS アカウント ID (111122223333 など) を入力して **Enter **キーを押します。

        ロケーションで検索するには、**[Properties]** (プロパティ) メニューから **[Location]** (ロケーション) を選択し、表示される **[Location]** (ロケーション) メニューからロケーションを選択します。選択したロケーション (Amazon S3 など) のルートロケーションにあるすべてのテーブルが返されます。

**を使用したテーブルの検索 AWS CLI**
+ 次の例は、部分検索を実行する方法を示しています。`--search-text` パラメータを使用すると、指定されたテキストがメタデータに含まれるテーブルを検索できます。この場合、名前、説明、またはその他のメタデータフィールドに「顧客」が含まれるすべてのテーブルが返されます。

  ```
  aws glue search-tables 
        --search-text "customer" 
        --region AWS リージョン
        --max-results 10
        --sort-criteria "FieldName=Name,Sort=ASC"
  ```

# AWS アカウント間でのデータカタログテーブルとデータベースの共有
<a name="sharing-catalog-resources"></a>

リソースに対する Lake Formation アクセス許可を外部 AWS アカウントに付与することで、Data Catalog リソース (データベースとテーブル) を外部アカウントと共有できます。ユーザーはその後、複数のアカウントにまたがるテーブルを結合してクエリするクエリとジョブを実行できるようになります。制限はいくつかありますが、Data Catalog リソースを別のアカウントと共有する場合、そのアカウント内のプリンシパルは、そのリソースをプリンシパルの Data Catalog 内にあるかのように操作することができます。

リソースは外部 AWS アカウントの特定のプリンシパルと共有しません。リソースは AWS アカウントまたは組織と共有します。 AWS 組織とリソースを共有する場合は、その組織にあるすべてのレベルのすべてのアカウントとリソースを共有することになります。共有後、各外部アカウントのデータレイク管理者が、そのアカウント内のプリンシパルに共有リソースに対する許可を付与する必要があります。

詳細については、「[Lake Formation でのクロスアカウントデータ共有](cross-account-permissions.md)」および「[データカタログリソースに対するアクセス許可の付与](granting-catalog-permissions.md)」を参照してください。

**以下も参照してください。**  
[共有 Data Catalog テーブルとデータベースへのアクセスと表示](viewing-shared-resources.md)
[前提条件](cross-account-prereqs.md)

# AWS Glue Data Catalog ビューの構築
<a name="working-with-views"></a>

では AWS Glue Data Catalog、*ビュー*は、1 つ以上のテーブルを参照する SQL クエリによってコンテンツが定義される仮想テーブルです。Amazon Athena、Amazon Redshift、または Apache Spark の SQL エディタを使用して、EMR Serverless または AWS Glue バージョン 5.0 を使用して、最大 10 個のテーブルを参照するデータカタログビューを作成できます。ビューの基盤となる参照テーブルは、同じデータベースに属することも、同じデータカタログ内の異なるデータベースに属する AWS アカウントこともできます。

[Apache Hudi、Linux Foundation Delta Lake](https://hudi.incubator.apache.org/)[https://delta.io/](https://delta.io/)、[Apache Iceberg](https://iceberg.apache.org/) などのオープンテーブル形式 (OTF) の標準 AWS Glue テーブルとテーブルを参照できます。基盤となるデータは、Amazon S3 ロケーションに登録されています AWS Lake Formation。また、Lake Formation と共有された Amazon Redshift データ共有のフェデレーションテーブルからビューを作成することもできます。

## データカタログビューと他のビュータイプとの区別
<a name="diff-views"></a>

データカタログビューは、Apache Hive、Apache Spark、Amazon Athena のビューとは異なります。データカタログビューは のネイティブ機能であり AWS Glue Data Catalog、マルチダイアレクト定義によって作成されたビューです。Athena や Amazon Redshift Spectrum など、サポートされている分析サービスのいずれかを使用してデータカタログビューを作成し、サポートされている他の分析サービスを使用して同じビューにアクセスできます。一方、Apache Hive、Apache Spark、Athena のビューは、Athena や Amazon Redshift などの各分析サービスで個別に作成され、そのサービス内でのみ表示およびアクセスできます。

## 定義者ビューとは
<a name="definer-view"></a>

 定義者ビューとは、そのビューを作成したプリンシパルのアクセス許可に基づいて動作する SQL ビューです。定義者ロールは、参照されるテーブルへのアクセスに必要なアクセス許可を持ち、ビューを定義する SQL ステートメントを実行します。定義者はビューを作成し、 AWS Lake Formationのきめ細かなアクセスコントロールを通じて他のユーザーと共有します。

ユーザーが定義者ビューにクエリを実行すると、クエリエンジンは、定義者ロールのアクセス許可を使用して基盤の参照テーブルにアクセスします。このアプローチにより、ユーザーはソーステーブルへの直接アクセスを必要とせずにビューを操作できるため、セキュリティが強化され、データのアクセス管理が簡素化されます。

定義者ビューを設定するには、定義者 IAM ロールをベーステーブルと同じ AWS アカウント内、またはクロスアカウント定義者ロールを使用する別のアカウント内に配置できます。定義者ロールに必要なアクセス許可の詳細については、「[ビュー作成の前提条件](views-prereqs.md)」を参照してください。

## マルチダイアレクトビューのフレームワーク
<a name="multi-dialect"></a>

データカタログは、複数の構造化クエリ言語 (SQL) ダイアレクトを使用したビューの作成をサポートしています。SQL は、リレーショナルデータベースに情報を保存および処理するために使用される言語であり、各 AWS 分析エンジンは独自のバリエーションの SQL または SQL ダイアレクトを使用します。

サポートされている分析クエリエンジンのいずれかを使用して、1 つの SQL ダイアレクトでデータカタログビューを作成します。その後、サポートされている他の分析エンジン内の別の SQL ダイアレクトで、`ALTER VIEW` ステートメントを使用してビューを更新できます。ただし、各ダイアレクトは同じテーブル、列、データ型のセットを参照する必要があります。

`GetTable` API AWS CLI と AWS コンソールを使用して、ビューで使用できる複数のダイアレクトにアクセスできます。このように、データカタログビューには、サポートされているさまざまな分析エンジンから参照やクエリを行うことができます。

データカタログビューでは、複数のエンジンからクエリできる共通のビュースキーマとメタデータオブジェクトを定義することで、データレイク全体で統一されたビューを使用できます。

各ダイアレクトでスキーマがどのように解決されるかの詳細については、[API リファレンスへのリンク]()を参照してください。さまざまなタイプのマッチングルールの詳細については、[API ドキュメントの関連するセクションへのリンク]()を参照してください。

## Lake Formation アクセス許可との統合
<a name="lf-view-integ"></a>

を使用して AWS Lake Formation 、ユーザーの AWS Glue Data Catalog ビューに対するアクセス許可管理を一元化できます。名前付きリソースメソッドまたは LF タグを使用して、Data Catalog ビューにきめ細かなアクセス許可を付与し、組織 AWS アカウント、 AWS 組織単位間で共有できます。リソースリンク AWS リージョン を使用して、 間でデータカタログビューを共有してアクセスすることもできます。これにより、ユーザーはデータソースを複製せずにデータアクセスを提供し、基になるテーブルを共有できます。

データカタログビューの `CREATE VIEW`DDL ステートメントは、Hudi、Delta Lake、Iceberg などのオープンテーブル形式 (OTF) の標準 AWS Glue テーブルとテーブルを、Lake Formation に登録されている Amazon S3 ロケーションに保存されている基盤となるデータとともに、Lake Formation と共有されている Amazon Redshift データ共有のフェデレーティッドテーブルで参照できます。テーブルのファイル形式は、ビューのクエリに使用されるエンジンがサポートしている形式であれば、任意の形式にすることができます。また、実行されているエンジンの組み込み関数を参照することもできますが、他のエンジン固有のリソースは許可されない場合があります。詳細については、「[データカタログビューの考慮事項と制限](views-notes.md)」を参照してください。

## ユースケース
<a name="views-use-cases"></a>

データカタログビューの重要なユースケースを以下に示します。
+ 1 つのビュースキーマでアクセス許可を作成および管理します。これにより、複数のエンジンで作成された重複したビューに対するアクセス許可に整合性がなくなるリスクを回避できます。
+ 基になる参照テーブルに直接アクセス許可を付与しなくても、複数のテーブルを参照するビューに対するアクセス許可をユーザーに付与できます。
+ LF タグを使用してテーブルの行レベルのフィルタリングを実現します (LF タグのカスケードは列レベルまでに限られます)。これは、ビューに LF タグを適用し、LF タグベースのアクセス許可をユーザーに付与することで行います。

## ビューでサポートされている AWS 分析サービス
<a name="views-supported-engines"></a>

次の AWS 分析サービスは、データカタログビューの作成をサポートしています。
+ Amazon Redshift
+ Amazon Athena バージョン 3
+ EMR Serverless 上の Apache Spark
+  AWS Glue バージョン 5.0 の Apache Spark

## その他のリソース
<a name="views-addtional-resources"></a>

データカタログの詳細については、このガイドおよび以下のリソースを参照してください。

次のビデオでは、Athena と Amazon Redshift からビューを作成してクエリを実行する方法を説明しています。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/rFO2OoxVYxE?si=Z0qsyuvTp2ZJg-PL/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/rFO2OoxVYxE?si=Z0qsyuvTp2ZJg-PL)


**Topics**
+ [データカタログビューと他のビュータイプとの区別](#diff-views)
+ [定義者ビューとは](#definer-view)
+ [マルチダイアレクトビューのフレームワーク](#multi-dialect)
+ [Lake Formation アクセス許可との統合](#lf-view-integ)
+ [ユースケース](#views-use-cases)
+ [ビューでサポートされている AWS 分析サービス](#views-supported-engines)
+ [その他のリソース](#views-addtional-resources)
+ [ビュー作成の前提条件](views-prereqs.md)
+ [DDL ステートメントを使用したデータカタログビューの作成](create-views.md)
+ [AWS Glue APIs を使用したデータカタログビューの作成](views-api-usage.md)
+ [データカタログビューに対する許可の付与](grant-perms-views.md)
+ [マテリアライズドビュー](materialized-views.md)

# ビュー作成の前提条件
<a name="views-prereqs"></a>
+ データカタログでビューを作成するには、参照テーブルの基礎となる Amazon S3 データの場所を Lake Formation に登録する必要があります。Lake Formation へのデータの登録の詳細については、「[データレイクへの Amazon S3 ロケーションの追加](register-data-lake.md)」を参照してください。
+ データカタログビューを作成できるのは IAM ロールだけです。他の IAM ID はデータカタログビューを作成できません。
+ ビューを定義する IAM ロールには、次のアクセス許可が必要です。
  + すべての列を含む、すべての参照テーブルに対する `Grantable` オプション付きの Lake Formation `SELECT` アクセス許可。
  + ビューが作成されるターゲットデータベースに対する Lake Formation `CREATE_TABLE` アクセス許可。
  + Lake Formation と AWS Glue のサービスがロールを引き受ける信頼ポリシー。

------
#### [ JSON ]

****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "DataCatalogViewDefinerAssumeRole1",
                "Effect": "Allow",
                "Principal": {
                   "Service": [
                        "glue.amazonaws.com",
                        "lakeformation.amazonaws.com"
                     ]
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    ```

------
  +  AWS Glue および Lake Formation の iam:PassRole アクセス許可。

------
#### [ JSON ]

****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "DataCatalogViewDefinerPassRole1",
                "Action": [
                    "iam:PassRole"
                ],
                "Effect": "Allow",
                "Resource": "*",
                "Condition": {
                    "StringEquals": {
                        "iam:PassedToService": [ 
                            "glue.amazonaws.com",
                            "lakeformation.amazonaws.com"
                          ]
                    }
                }
            }
        ]
    }
    ```

------
  + AWS Glue および Lake Formation のアクセス許可。

------
#### [ JSON ]

****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
                     "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "Glue:GetDatabase",
                    "Glue:GetDatabases",
                    "Glue:CreateTable",
                    "Glue:GetTable",
                    "Glue:GetTables",
                    "Glue:BatchGetPartition",
                    "Glue:GetPartitions",
                    "Glue:GetPartition",
                    "Glue:GetTableVersion",
                    "Glue:GetTableVersions",
    				"Glue:PassConnection",
                    "lakeFormation:GetDataAccess"
                ],
                "Resource": "*"
            }
        ]   
    }
    ```

------
+ `IAMAllowedPrincipals` グループに `Super` または `ALL` アクセス許可が付与されているデータベースにビューを作成することはできません。データベースに設定されている `IAMAllowedPrincipals` グループの `Super` アクセス許可を取り消すか、「[ステップ 4: データストアを Lake Formation 許可モデルに切り替える](upgrade-glue-lake-formation.md#upgrade-glue-lake-formation-step4)」を参照するか、または **[新しく作成されたテーブルのデフォルトのアクセス許可]** の **[このデータベースの新しいテーブルに IAM アクセスコントロールのみを使用]** ボックスをオフにして新しいデータベースを作成できます。

# DDL ステートメントを使用したデータカタログビューの作成
<a name="create-views"></a>

Athena、Amazon Redshift の SQL エディタと AWS Glue APIs/ を使用して AWS Glue Data Catalog ビューを作成できますAWS CLI。

SQL エディタを使用してデータカタログビューを作成するには、Athena または Redshift Spectrum を選択し、`CREATE VIEW` データ定義言語 (DDL) ステートメントを使用してビューを作成します。最初のエンジンのダイアレクトでビューを作成した後、2 番目のエンジンの `ALTER VIEW` DDL ステートメントを使用してダイアレクトを追加できます。

ビューを定義するときは、次の点を考慮することが重要です。
+ **マルチダイアレクトビューの定義** - 複数のダイアレクトでビューを定義する場合、異なるダイアレクトのスキーマが一致している必要があります。各 SQL ダイアレクトは構文の仕様が若干異なります。データカタログビューを定義するクエリ構文は、どのダアレクトでもまったく同じ列リストに解決され、各列のタイプと名前も一致する必要があります。この情報はビューの `StorageDescriptor` に格納されます。各ダイアレクトでは、データカタログから、基になる同じテーブルオブジェクトを参照する必要もあります。

  DDL を使用してビューに別のダイアレクトを追加するには、`ALTER VIEW` ステートメントを使用できます。`ALTER VIEW` ステートメントでビュー定義を更新しようとすると (ストレージ記述子やビューの基になるテーブルを変更しようとした場合など)、ステートメントから「Input and existing storage descriptor mismatch」というエラーが出力されます。ビューの列タイプを確実に一致させるには、SQL のキャスト操作を使用できます。
+ **ビューの更新** - ビューを更新するには、`UpdateTable` API を使用できます。ストレージ記述子や参照テーブルを一致させずにビューを更新する場合は、`FORCE` フラグを指定できます (構文についてはエンジン SQL ドキュメントを参照してください)。強制更新後、ビューには強制された `StorageDescriptor` と参照テーブルが反映されます。それ以降の `ALTER VIEW` DDL は、変更された値と一致する必要があります。更新の結果として互換性のないダイアレクトが含まれるビューは、「Stale」ステータスになります。ビューのステータスは、Lake Formation コンソールおよび `GetTable` オペレーションを使用して確認できます。
+ **varchar 列タイプの文字列としての参照** - Redshift Spectrum の varchar 列タイプを文字列にキャストすることはできません。Redshift Spectrum で varchar 列タイプを持つビューが作成され、後続のダイアレクトがそのフィールドを文字列として参照しようとすると、データカタログは `FORCE` フラグがなくてもそのフィールドを文字列として扱います。
+ **複合タイプのフィールドの処理** - Amazon Redshift ではすべての複合タイプが [SUPER タイプ](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html)として扱われますが、Athena では複合タイプが指定されます。ビューに `SUPER` タイプのフィールドがあり、別のエンジンがその列を構造体 (`<street_address:struct<street_number:int, street_name:string, street_type:string>>`) などの特定の複合タイプとして参照する場合、データカタログはフィールドが特定の複合タイプであると想定し、`Force` フラグがなくてもそのタイプをストレージ記述子で使用します。

データカタログビューを作成および管理するための構文の詳細については、以下を参照してください。
+ Amazon Athena ユーザーガイドの「[AWS Glue Data Catalog ビューの使用](https://docs.aws.amazon.com/athena/latest/ug/views-glue.html)」。
+ 「Amazon Athena ユーザーガイド」の「[Glue データカタログビューのクエリ構文](https://docs.aws.amazon.com/athena/latest/ug/views-glue-ddl.html)」。
+ Amazon Redshift データベース開発者ガイドの「[AWS Glue Data Catalogでのビューの作成](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)」。

  データカタログ内のビューに関連する SQL コマンドの詳細については、「[外部ビューの作成](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_VIEW.html)」、「[外部ビューの変更](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_EXTERNAL_VIEW.html)」、および「[外部ビューの削除](https://docs.aws.amazon.com/redshift/latest/dg/r_DROP_EXTERNAL_VIEW.html)」を参照してください。

データカタログビューを作成すると、ビューの詳細が Lake Formation コンソールに表示されます。

1. Lake Formation コンソールの [データカタログ] で **[ビュー]** を選択します。

1. 使用可能なビューのリストがビューページに表示されます。

1. リストからビューを選択すると、詳細ページにビューの属性が表示されます。

![\[下側のセクションには 5 つのタブが水平に配置されており、各タブには対応する情報が含まれています。\]](http://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/images/view-definition.png)


Schema  
`Column` 行を選択し、**[LF タグの編集]** を選択して、タグ値の更新や新しい LF タグの割り当てを行います。

SQL 定義  
使用可能な SQL 定義のリストが表示されます。**[SQL 定義を追加]** を選択し、クエリエンジンを選択して SQL 定義を追加します。`Edit definition` 列の下にあるクエリエンジン (Athena または Amazon Redshift) を選択して、SQL 定義を更新します。

LF タグ  
**[LF タグを編集**] を選択して、タグの値を編集したり、新しいタグを割り当てたりします。LF タグを使用すると、ビューに許可を付与できます。

クロスアカウントアクセス  
データカタログビューを共有した AWS アカウント組織と組織単位 (OUs) のリストを表示できます。

基礎となるテーブル  
ビューの作成に使用された SQL 定義で参照される基礎となるテーブルがこのタブに表示されます。

# AWS Glue APIs を使用したデータカタログビューの作成
<a name="views-api-usage"></a>

 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API と [UpdateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateTable.html) APIs を使用して、データカタログでビューを作成および更新できます。`CreateTable` および `UpdateTable` オペレーションには、`ViewDefinition` を含む新しい `TableInput` 構造が用意されています。`SearchTables`、`GetTable`、`GetTables`、`GetTableVersion`、`GetTableVersions` オペレーションでは、ビューの出力構文に `ViewDefinition` が含められます。さらに、`GetTable` API の出力には新しい `Status` フィールドがあります。

サポートされている各クエリエンジンと Amazon Athena Amazon Redshift の SQL ダイアレクトを検証するために、2 つの新しい AWS Glue 接続を使用できます。

`CreateTable` および `UpdateTable` API は、ビューで使用する場合は非同期です。これらの API が複数の SQL ダイアレクトで呼び出されると、各エンジンで呼び出しが検証され、そのエンジンでダイアレクトを実行できるかどうか、および各ダイアレクトから返される結果のビューのスキーマが一致するかどうかが判定されます。この AWS Glue サービスは、これらの接続を使用して、分析エンジンへの内部呼び出しを行います。これらの呼び出しは、`CREATE VIEW` または `ALTER VIEW` SQL DDL がエンジンで実行されたとした場合にそのエンジンで行われる検証をシミュレートします。

指定された SQL が有効で、各ビューダイアレクトのスキーマが一致すれば、 AWS Glue API は結果を不可分的にコミットします。この不可分性により、複数のダイアレクトを持つビューをダウンタイムなしで作成または変更できます。

**Topics**
+ [ステータスを検証するための AWS Glue 接続の作成](views-api-usage-connection.md)
+ [ビューの生成ステータスの検証](views-api-usage-get-table.md)
+ [非同期状態とオペレーション](views-api-usage-async-states.md)
+ [非同期オペレーションでの作成失敗シナリオの例](views-api-usage-errors.md)

# ステータスを検証するための AWS Glue 接続の作成
<a name="views-api-usage-connection"></a>

`CreateTable` または `UpdateTable`オペレーションを使用して AWS Glue Data Catalog ビューを作成または更新するには、検証用の新しいタイプの AWS Glue 接続を作成し、サポートされている分析エンジンに提供する必要があります。この接続は、Athena または Amazon Redshift でデータカタログビューを使用するために必要です。これらの接続は AWS CLI、、 AWS SDKs、または AWS Glue APIs を使用してのみ作成できます。を使用して AWS Glue 接続 AWS マネジメントコンソール を作成することはできません。

**注記**  
ビュー定義者のロールと `CreateTable` または `UpdateTable` を呼び出すロールが異なる場合は、両方の IAM ポリシーステートメントに `glue:PassConnection` アクセス許可が必要です。

詳細については、[「create-connection](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-connection.html) AWS CLI ドキュメント」を参照してください。

**AWS CLI 接続を作成するための コマンド**  
接続を作成するための AWS CLI コマンドを次に示します。

```
aws glue create-connection --region us-east-1 
--endpoint-url https://glue.us-east-1.amazonaws.com 
--cli-input-json file:///root/path/to/create-connection.json
```

**AWS CLI 入力 JSON**  
Amazon Redshift の場合:

```
{
    "CatalogId": "123456789012",
    "ConnectionInput": {
        "ConnectionType": "VIEW_VALIDATION_REDSHIFT",
        "Name": "views-preview-cluster-connection-2",
        "Description": "My first Amazon Redshift validation connection",
        "ConnectionProperties": {
            "DATABASE": "dev",
            "CLUSTER_IDENTIFIER": "glue-data-catalog-views-preview-cluster"
        }
    }
}
```

Amazon Athena の場合:

```
{
    "CatalogId": "123456789012",
    "ConnectionInput": {
        "ConnectionType": "VIEW_VALIDATION_ATHENA",
        "Name": "views-preview-cluster-connection-3",
        "Description": "My first Amazon Athena validation connection",
        "ConnectionProperties": {
            "WORKGROUP_NAME": "workgroup-name"
        }
    }
}
```

# ビューの生成ステータスの検証
<a name="views-api-usage-get-table"></a>

`CreateTable` または `UpdateTable` オペレーションを実行すると、`GetTable` API 出力の `Status` フィールドに、ビューの作成ステータスの詳細が示されます。テーブルがまだ存在しない`create`リクエストの場合、 は非同期プロセス中に空のテーブル AWS Glue を作成します。`GetTable` の呼び出し時には、オプションでブール値の `IncludeStatusDetails` フラグを渡すことができます。このフラグは、リクエストに関する診断情報を出力するように指定します。エラーが発生すると、このフラグは、各ダイアレクトの個々のステータスを含むエラーメッセージを提供します。

ビューの作成、読み取り、更新、削除 (CRUD) オペレーション中のエラーは、 AWS Glue/Lake Formation サービスでの処理中、または Amazon Redshift または Athena でのビュー SQL 検証中に発生する可能性があります。エンジンの検証中にエラーが発生した場合、 AWS Glue サービスは、エンジンから返されたエラーメッセージを提供します。

**ステータスフィールド**  
以下はステータスフィールドです。
+ Status - さまざまなジョブのタイプに依存しない汎用のステータスです。
  + QUEUED
  + IN\$1PROGRESS
  + SUCCESS
  + FAILED
+ Action - テーブルで呼び出されたアクションを示します。現時点では、`CREATE` または `UPDATE` オペレーションのみが利用可能です。

  ビューを操作するときは、`UPDATE` オペレーションと `CREATE` オペレーションを区別することが重要です。オペレーションタイプによって、テーブルのクエリをどのように進めるかべきが決まります。

   `UPDATE` オペレーションは、テーブルがデータカタログに既に存在することを意味します。この場合、以前に作成されたテーブルへのクエリを問題なく続行できます。一方、`CREATE ` オペレーションは、これまでテーブルが正常に作成されたことはないことを示します。テーブルが `CREATE` としてマークされている場合、そのテーブルはまだシステムに存在しないため、クエリを試みても失敗します。したがって、テーブルのクエリを試みる前にオペレーションタイプ (UPDATE または CREATE) を特定する必要があります。
+ RequestedBy - 非同期の変更をリクエストしたユーザーの ARN。
+ UpdatedBy - キャンセルや変更のリクエストなど、非同期変更プロセスを最後に手動で変更したユーザーの ARN。
+ Error - このフィールドは状態が **FAILED** の場合にのみ存在します。これは親レベルの例外メッセージです。ダイアレクトごとに異なるエラーが発生する場合があります。
  + ErrorCode - 例外のタイプ。
  + ErrorMessage - 例外の簡単な説明。
+ RequestTime - 変更が開始された時刻を示す ISO 8601 形式の日付文字列。
+ UpdateTime - 状態が最後に更新された時刻を示す ISO 8601 形式の日付文字列。

# 非同期状態とオペレーション
<a name="views-api-usage-async-states"></a>

`glue:CreateTable` リクエストを実行すると、データカタログビューの非同期作成が開始されます。以下のセクションでは、このドキュメントで、`glue:GetTable`レスポンスで使用できる AWS Glue ビュー`Status`の について説明します。簡潔にするために、このセクションではレスポンス全体は省略しています。

```
{
    "Table": {
        ...
        "Status": {
            ...
            "Action": "CREATE",
            "State": "QUEUED",
        }
    }
}
```

上記の属性はどちらも重要な診断情報を表し、非同期オペレーションの状態と、このビューで実行できるアクションを示します。これらの属性が取り得る値は次のとおりです。

1. `Status.Action`

   1. CREATE

   1. UPDATE

1. `Status.State`

   1. QUEUED

   1. IN\$1PROGRESS

   1. SUCCESS

   1. FAILED

重要な点として、データカタログビューの更新の中には、非同期オペレーションを必要としないものがあることにも注意してください。例えば、テーブルの `Description` 属性を更新しようとしているとします。これは非同期オペレーションを必要としないため、結果のテーブルメタデータには `Status` が含まれず、属性は `NULL` になります。

```
{
    "Table": {
        ...,
        "Description": "I changed this attribute!"
    }
}
```

次に、このトピックでは、上記のステータス情報が AWS Glue ビューで実行できるオペレーションにどのように影響するかについて説明します。

**glue:CreateTable**  
この API は、Glue テーブルに対する `glue:CreateTable` の動作と比べて変更はありません。`CreateTable` は、まだ存在しない任意のテーブル名に対して呼び出すことができます。

**glue:UpdateTable**  
このオペレーションは、以下のステータス情報を持つ AWS Glue ビューでは実行できません。

1. Action == CREATE かつ State == QUEUED

1. Action == CREATE かつ State == IN\$1PROGRESS

1. Action == CREATE かつ State == FAILED

1. Action == UPDATE かつ State == QUEUED

1. Action == UPDATE かつ State == IN\$1PROGRESS

まとめると、データカタログビューは以下の要件を満たしている場合にのみ更新できます。

1. 最初に正常に作成された場合。

   1. Action == CREATE かつ State == SUCCESS

1. 非同期更新オペレーションの後、最終状態に達している場合。

   1. Action == UPDATE かつ State == SUCCESS

   1. Action == UPDATE かつ State == FAILED

1. 同期更新の結果として State 属性が `NULL` になっている場合。

**glue:DeleteTable**  
このオペレーションは、 がどの AWS Glue テーブルに対してどのように`glue:DeleteTable`機能するかと比較して変更されません。データカタログビューは、その状態に関係なく削除できます。

**glue:GetTable**  
このオペレーションは、 がどの AWS Glue テーブルに対してどのように`glue:GetTable`機能するかと比較して変更されません。ただし、データカタログビューが最初に正常に作成されるまで (`Action == CREATE and State == SUCCESS`)、分析エンジンからデータカタログビューにクエリを実行することはできません。データカタログビューが最初に正常に作成された後は、ステータスに関係なくビューをクエリできます。

**注記**  
このセクションのすべての情報は、`GetTable`、`GetTables`、`SearchTables` などのすべてのテーブル読み取り API に適用されます。

# 非同期オペレーションでの作成失敗シナリオの例
<a name="views-api-usage-errors"></a>

ここでは、ビューに対する `CreateTable` または `UpdateTable` API コールの結果として発生する可能性のある代表的なエラータイプの例を示します。SQL クエリの失敗のエラーサーフェスは大きいため、これらはすべてを網羅するものではありません。

## シナリオ 1: Amazon Redshift クエリの失敗
<a name="views-api-usage-errors-scenario-1"></a>

Amazon Redshift に指定されたクエリにテーブル名のスペルミスが含まれているため、検証時にテーブルがデータカタログ内に見つかりません。結果のエラーは、ビューの `GetTable` レスポンスの `Status` フィールドに示されます。

`GetTable` リクエスト:

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-72",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table__1\";",
                    "ValidationConnection": "redshift-connection"
                }
            ]
        }
    }
}
```

`GetTable` レスポンス:

```
IncludeStatusDetails = FALSE
{
    "Table": {
        "Name": "view-athena-redshift-72",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:39:19-07:00",
        "UpdateTime": "2024-07-11T11:39:19-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:39:19-07:00",
            "UpdateTime": "2024-07-11T11:40:06-07:00",
            "Action": "CREATE",
            "State": "FAILED"
        }
    }
}

IncludeStatusDetails = TRUE
{
    "Table": {
        "Name": "view-athena-redshift-72",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:39:19-07:00",
        "UpdateTime": "2024-07-11T11:39:19-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:39:19-07:00",
            "UpdateTime": "2024-07-11T11:40:06-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "QueryExecutionException",
                "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection | Query Execution Id: ddb711d3-2415-4aa9-b251-6a76ab4f41b1 | Timestamp: Thu Jul 11 18:39:37 UTC 2024]: Redshift returned error for the statement: ERROR: AwsClientException: EntityNotFoundException from glue - Entity Not Found"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-72",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table__1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:40:06-07:00",
                        "State": "SUCCESS"
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table__1\";",
                        "UpdateTime": "2024-07-11T11:39:37-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "QueryExecutionException",
                            "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection | Query Execution Id: ddb711d3-2415-4aa9-b251-6a76ab4f41b1 | Timestamp: Thu
 Jul 11 18:39:37 UTC 2024]: Redshift returned error for the statement: ERROR: AwsClientException: EntityNotFoundException from glue - Entity Not Found"
                        }
                    }
                ]
            }
        }
    }
}
```

## シナリオ 2: 無効な Amazon Redshift 接続
<a name="views-api-usage-errors-scenario-2"></a>

次の例の Amazon Redshift 接続は、指定されたクラスター/サーバーレスエンドポイントに存在しない Amazon Redshift データベースを参照しているため、正しくありません。Amazon Redshift はビューを検証できず、`GetTable` レスポンスの `Status` フィールドにはエラー (Amazon Redshift からの `"State": "FAILED"`) が示されます。

`GetTable` リクエスト:

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-73",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                    "ValidationConnection": "redshift-connection-malformed"
                }
            ]
        }
    }
}
```

`GetTable` レスポンス:

```
IncludeStatusDetails = FALSE
{
    "Table": {
        "Name": "view-athena-redshift-73",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:43:27-07:00",
        "UpdateTime": "2024-07-11T11:43:27-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:43:27-07:00",
            "UpdateTime": "2024-07-11T11:43:40-07:00",
            "Action": "CREATE",
            "State": "FAILED"
        }
    }
}

IncludeStatusDetails = TRUE
{
    "Table": {
        "Name": "view-athena-redshift-73",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:43:27-07:00",
        "UpdateTime": "2024-07-11T11:43:27-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:43:27-07:00",
            "UpdateTime": "2024-07-11T11:43:40-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "QueryExecutionException",
                "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection-malformed | Query Execution Id: 69bfafd4-3d51-4cb0-9320-7ce5404b1809 | Timestamp: Thu Jul 11 18:43:38 UTC 2024]: Redshift returned error for the statement: FATAL: database \"devooo\" does not exist"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-73",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:43:40-07:00",
                        "State": "SUCCESS"
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                        "UpdateTime": "2024-07-11T11:43:38-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "QueryExecutionException",
                            "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection-malformed | Query Execution Id: 69bfafd4-3d51-4cb0-9320-7ce5404b1809 | Time
stamp: Thu Jul 11 18:43:38 UTC 2024]: Redshift returned error for the statement: FATAL: database \"devooo\" does not exist"
                        }
                    }
                ]
            }
        }
    }
}
```

## シナリオ 3: Athena クエリの失敗
<a name="views-api-usage-errors-scenario-3"></a>

ここでの Athena の SQL は、クエリにデータベース名のスペルミスが含まれているため無効です。Athena のクエリ検証によってこれが検出され、結果のエラーが `GetTable` 呼び出しの `Status` オブジェクトを通じて表面化されます。

`GetTable` リクエスト:

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-70",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT * FROM \"gdc--view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                    "ValidationConnection": "redshift-connection"
                }
            ]
        }
    }
}
```

`GetTable` レスポンス:

```
IncludeStatusDetails = FALSE
{
    "Table": {
        "Name": "view-athena-redshift-70",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:09:53-07:00",
        "UpdateTime": "2024-07-11T11:09:53-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:09:54-07:00",
            "UpdateTime": "2024-07-11T11:10:41-07:00",
            "Action": "CREATE",
            "State": "FAILED",
        }
    }
}

IncludeStatusDetails = TRUE
{
    "Table": {
        "Name": "view-athena-redshift-70",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:09:53-07:00",
        "UpdateTime": "2024-07-11T11:09:53-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:09:54-07:00",
            "UpdateTime": "2024-07-11T11:10:41-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "QueryExecutionException",
                "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: athena-connection | Query Execution Id: d9bb1e6d-ce26-4b35-8276-8a199af966aa | Timestamp: Thu Jul 11 18:10:
41 UTC 2024]: Athena validation FAILED: {ErrorCategory: 2,ErrorType: 1301,Retryable: false,ErrorMessage: line 1:118: Schema 'gdc--view-playground-db' does not exist}"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-70",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT * FROM \"gdc--view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT * FROM \"gdc--view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:10:41-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "QueryExecutionException",
                            "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: athena-connection | Query Execution Id: d9bb1e6d-ce26-4b35-8276-8a199af966aa | Timestamp: Thu J
ul 11 18:10:41 UTC 2024]: Athena validation FAILED: {ErrorCategory: 2,ErrorType: 1301,Retryable: false,ErrorMessage: line 1:118: Schema 'gdc--view-playground-db' does not exist}"
                        }
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                        "UpdateTime": "2024-07-11T11:10:41-07:00",
                        "State": "SUCCESS"
                    }
                ]
            }
        }
    }
}
```

## シナリオ 4: ストレージ記述子の不一致
<a name="views-api-usage-errors-scenario-4"></a>

Athena ダイアレクトに指定された SQL では `col1` と `col2` が選択されますが、Redshift の SQL では `col1` のみが選択されます。これにより、ストレージ記述子の不一致エラーが発生します。

`GetTable` リクエスト:

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-71",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT col1, col2 FROM \"gdc-view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT col1 FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                    "ValidationConnection": "redshift-connection"
                }
            ]
        }
    }
}
```

`GetTable` レスポンス:

```
IncludeStatusDetails = FALSE

{
    "Table": {
        "Name": "view-athena-redshift-71",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:22:02-07:00",
        "UpdateTime": "2024-07-11T11:22:02-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:22:02-07:00",
            "UpdateTime": "2024-07-11T11:23:19-07:00",
            "Action": "CREATE",
            "State": "FAILED"
        }
    }
}

IncludeStatusDetails = TRUE

{
    "Table": {
        "Name": "view-athena-redshift-71",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:22:02-07:00",
        "UpdateTime": "2024-07-11T11:22:02-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:22:02-07:00",
            "UpdateTime": "2024-07-11T11:23:19-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "InvalidInputException",
                "ErrorMessage": "Engine and existing storage descriptor mismatch"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-71",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT col1, col2 FROM \"gdc-view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT col1 FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT col1, col2 FROM \"gdc-view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:23:19-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "InvalidInputException",
                            "ErrorMessage": "Engine and existing storage descriptor mismatch"
                        }
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT col1 FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                        "UpdateTime": "2024-07-11T11:22:49-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "InvalidInputException",
                            "ErrorMessage": "Engine and existing storage descriptor mismatch"
                        }
                    }
                ]
            }
        }
    }
}
```

# データカタログビューに対する許可の付与
<a name="grant-perms-views"></a>

 でビューを作成したら AWS Glue Data Catalog、ビューに対するデータレイクのアクセス許可を、、組織 AWS アカウント、組織単位全体のプリンシパルに付与できます。アクセス許可は、LF タグまたは名前付きリソース方式を使用して付与できます。リソースのタグ付けの詳細については、「[Lake Formation のタグベースのアクセス制御](tag-based-access-control.md)」を参照してください。ビューに対するアクセス許可の直接付与の詳細については、「[名前付きリソース方式を使用したビューに対するアクセス権限の付与](granting-view-permissions.md)」を参照してください。

# マテリアライズドビュー
<a name="materialized-views"></a>

**Topics**
+ [マテリアライズドビューを他のビュータイプと区別する](#materialized-views-differentiating)
+ [ユースケース](#materialized-views-use-cases)
+ [主要なコンセプト](#materialized-views-key-concepts)
+ [マテリアライズドビューのアクセス許可](#materialized-views-permissions)
+ [マテリアライズドビューの作成と管理](#materialized-views-creating-managing)
+ [ストレージとデータアクセス](#materialized-views-storage-access)
+ [アクセス AWS Lake Formation 許可との統合](#materialized-views-lake-formation)
+ [モニタリングとデバッグ](#materialized-views-monitoring-debugging)
+ [更新ジョブの管理](#materialized-views-managing-refresh-jobs)
+ [モニタリングとトラブルシューティング](#materialized-views-monitoring-troubleshooting)
+ [考慮事項と制限事項](#materialized-views-considerations-limitations)

 AWS Glue データカタログでは、マテリアライズドビューは、SQL クエリの事前計算された結果を Apache Iceberg 形式で保存するマネージドテーブルです。アクセスされるたびにクエリを実行する標準の Data Catalog ビューとは異なり、マテリアライズドビューはクエリ結果を物理的に保存し、基盤となるソーステーブルが変更されるたびに更新します。Amazon Athena、Amazon EMR、または で Apache Spark バージョン 3.5.6 以降を使用してマテリアライズドビューを作成できます AWS Glue。

マテリアライズドビューは、 AWS Glue Data Catalog に登録された Apache Iceberg テーブルを参照し、事前計算されたデータは Amazon S3 Tables バケットまたは Amazon S3 汎用バケットに Apache Iceberg テーブルとして保存されるため、Amazon Athena、Amazon Redshift、サードパーティーの Iceberg 互換エンジンなどの複数のクエリエンジンからアクセスできます。

## マテリアライズドビューを他のビュータイプと区別する
<a name="materialized-views-differentiating"></a>

マテリアライズドビューは、 AWS Glue データカタログビュー、Apache Spark ビュー、Amazon Athena ビューと根本的に異なります。データカタログビューは、アクセスされるたびに SQL クエリ定義を実行する仮想テーブルですが、マテリアライズドビューは事前に計算されたクエリ結果を物理的に保存します。これにより、冗長な計算が不要になり、頻繁にアクセスされる複雑な変換のクエリパフォーマンスが大幅に向上します。

マテリアライズドビューは、ETL ジョブまたはカスタム Spark AWS Glue ジョブで構築された従来のデータ変換パイプラインとも異なります。変更検出、増分更新、ワークフローオーケストレーションを処理するカスタムコードを記述する代わりに、標準の SQL 構文を使用してマテリアライズドビューを定義します。Data Catalog AWS Glue は、フルマネージド型のコンピューティングインフラストラクチャを使用して、ソーステーブルを自動的にモニタリングし、変更を検出し、マテリアライズドビューを更新します。

## ユースケース
<a name="materialized-views-use-cases"></a>

マテリアライズドビューの重要なユースケースは次のとおりです。
+ **複雑な分析クエリの高速化** – 高価な結合、集計、ウィンドウ関数を事前に計算するマテリアライズドビューを作成します。Spark エンジンは、事前計算された結果を使用するように後続のクエリを自動的に書き換え、クエリのレイテンシーとコンピューティングコストを削減します。
+ **データ変換パイプラインの簡素化** – 変更検出、増分更新、ワークフローオーケストレーションを処理する複雑な ETL ジョブを、シンプルな SQL ベースのマテリアライズドビュー定義に置き換えます。 AWS Glue Data Catalog は、すべての運用上の複雑さを自動的に管理します。
+ **管理されたデータアクセスでセルフサービス分析を有効にする** – 未加工データをビジネス対応データセットに変換する厳選されたマテリアライズドビューを作成します。基盤となるソーステーブルを公開することなくマテリアライズドビューへのアクセス権をユーザーに付与し、セルフサービス分析を強化しながらセキュリティ管理を簡素化します。
+ **機械学習の特徴量エンジニアリングを最適化する** – ML モデルの特徴量変換を実装するマテリアライズドビューを定義します。自動更新機能により、ソースデータの進化に合わせて機能ストアを最新の状態に保ち、増分更新によりコンピューティングコストを最小限に抑えます。
+ **効率的なデータ共有の実装** – 特定のコンシューマーのデータをフィルタリングおよび変換するマテリアライズドビューを作成します。を使用してアカウントとリージョン間でマテリアライズドビューを共有するため AWS Lake Formation、一元化されたガバナンスを維持しながら、データの重複を排除できます。

## 主要なコンセプト
<a name="materialized-views-key-concepts"></a>

### 自動更新
<a name="materialized-views-automatic-refresh"></a>

自動更新は、ソーステーブルを継続的にモニタリングし、定義したスケジュールに従ってマテリアライズドビューを更新する機能です。マテリアライズドビューを作成するときは、1 時間間隔の時間ベースのスケジューリングを使用して更新頻度を指定できます。 AWS Glue Data Catalog は、マネージド Spark コンピューティングインフラストラクチャを使用してバックグラウンドで更新オペレーションを実行し、変更検出と増分更新のすべての側面を透過的に処理します。

更新間隔の間にソースデータが変更されると、マテリアライズドビューは一時的に古くなります。マテリアライズドビューに直接アクセスするクエリは、次のスケジュールされた更新が完了するまで、古い結果を返します。最新のデータへの即時アクセスが必要なシナリオでは、`REFRESH MATERIALIZED VIEW`SQL コマンドを使用して手動更新を実行できます。

### 増分更新
<a name="materialized-views-incremental-refresh"></a>

増分更新は、マテリアライズドビュー全体を再計算するのではなく、前回の更新以降にソーステーブルで変更されたデータのみを処理する最適化手法です。 AWS Glue Data Catalog は Apache Iceberg のメタデータレイヤーを活用して、ソーステーブルの変更を効率的に追跡し、マテリアライズドビューのどの部分に更新が必要かを判断します。

このアプローチは、フル更新オペレーションと比較して、コンピューティングコストと更新期間を大幅に削減します。特に、更新サイクル間でデータ変更の割合がごくわずかである大規模なデータセットの場合です。増分更新メカニズムは自動的に動作します。変更されたデータを検出または処理するためにカスタムロジックを記述する必要はありません。

### 自動クエリ書き換え
<a name="materialized-views-automatic-query-rewrite"></a>

自動クエリ書き換えは、Amazon Athena、Amazon EMR、および の Spark エンジンで使用できるクエリ最適化機能です AWS Glue。ベーステーブルに対してクエリを実行すると、Spark オプティマイザはクエリプランを分析し、使用可能なマテリアライズドビューがクエリをより効率的に満たすことができるかどうかを自動的に判断します。適切なマテリアライズドビューが存在する場合、オプティマイザはベーステーブルを処理する代わりに、事前に計算された結果を使用するようにクエリを透過的に書き換えます。

この最適化は、アプリケーションコードやクエリステートメントを変更することなく行われます。Spark オプティマイザは、自動クエリ書き換えがマテリアライズドビューが最新で、正確な結果を生成できる場合にのみ適用されるようにします。マテリアライズドビューが古くなったり、クエリ要件に完全に一致しない場合、オプティマイザはベーステーブルに対して元のクエリプランを実行し、パフォーマンスよりも正確性を優先します。

### ビュー定義ロール
<a name="materialized-views-view-definer-role"></a>

マテリアライズドビューは、ビュー定義ロールと呼ばれる、マテリアライズドビューを作成した IAM ロールのアクセス許可に基づいて動作します。定義者ロールには、マテリアライズドビュー定義で参照されるすべてのベーステーブルへの読み取りアクセスと、ターゲットデータベースへのテーブルアクセス許可の作成が必要です。Data Catalog AWS Glue がマテリアライズドビューを更新すると、ソーステーブルにアクセスして更新された結果を書き込むための定義ロールを引き受けます。

このセキュリティモデルを使用すると、基になるソーステーブルに対する直接アクセス許可を付与することなく、マテリアライズドビューへのアクセス権をユーザーに付与できます。ビュー定義ロールがベーステーブルにアクセスできなくなった場合、アクセス許可が復元されるまで後続の更新オペレーションは失敗します。

## マテリアライズドビューのアクセス許可
<a name="materialized-views-permissions"></a>

マテリアライズドビューを作成および管理するには、 AWS Lake Formation アクセス許可を設定する必要があります。マテリアライズドビューを作成する IAM ロール (定義ロール) には、ソーステーブルとターゲットデータベースに対する特定のアクセス許可が必要です。

### 定義者ロールに必要なアクセス許可
<a name="materialized-views-required-permissions-definer-role"></a>

定義者ロールには、次の Lake Formation アクセス許可が必要です。
+ ソーステーブル – 行、列、またはセルフィルターが適用されていない SELECT または ALL アクセス許可
+ ターゲットデータベース – CREATE\$1TABLE アクセス許可
+  AWS Glue データカタログ – GetTable および CreateTable API アクセス許可

マテリアライズドビューを作成すると、定義ロールの ARN がビュー定義に保存されます。 AWS Glue データカタログは、自動更新オペレーションを実行するときにこのロールを引き受けます。定義者ロールがソーステーブルへのアクセスを失った場合、アクセス許可が復元されるまで更新オペレーションは失敗します。

### AWS Glue ジョブの IAM アクセス許可
<a name="materialized-views-iam-permissions-glue-jobs"></a>

 AWS Glue ジョブの IAM ロールには、次のアクセス許可が必要です。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetCatalog",
                "glue:GetCatalogs",
                "glue:GetTable",
                "glue:GetTables",
                "glue:CreateTable",
                "glue:UpdateTable",
                "glue:DeleteTable",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*:/aws-glue/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess"
            ],
            "Resource": "*"
        }
    ]
}
```

マテリアライズドビューの自動更新に使用するロールには、ロールに対する iam:PassRole アクセス許可が必要です。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

Glue でマテリアライズドビューを自動的に更新するには、サービスがロールを引き受けることができる次の信頼ポリシーもロールに必要です。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

マテリアライズドビューが S3 Tables バケットに保存されている場合は、ロールに次のアクセス許可も追加する必要があります。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3tables:PutTableMaintenanceConfiguration"
      ],
      "Resource": "arn:aws:s3tables:*:123456789012:*"
    }
  ]
}
```

### マテリアライズドビューへのアクセスを付与する
<a name="materialized-views-granting-access"></a>

マテリアライズドビューをクエリするアクセス許可を他のユーザーに付与するには、 AWS Lake Formation を使用してマテリアライズドビューテーブルに対する SELECT アクセス許可を付与します。ユーザーは、マテリアライズドビューをクエリできます。基盤となるソーステーブルに直接アクセスする必要はありません。

Lake Formation アクセス許可の設定の詳細については、「 AWS Lake Formation デベロッパーガイド」の「データカタログリソースに対するアクセス許可の付与と取り消し」を参照してください。

## マテリアライズドビューの作成と管理
<a name="materialized-views-creating-managing"></a>

Spark エンジンの `CREATE MATERIALIZED VIEW` SQL ステートメントを使用してマテリアライズドビューを作成します。ビュー定義は、変換ロジック、ターゲットデータベースとテーブル名、およびオプションの更新設定を定義する SQL クエリを指定します。集計、複数のテーブル間の結合、フィルター、ウィンドウ関数など、複雑な変換を定義できます。

```
CREATE MATERIALIZED VIEW sales_summary
AS
SELECT 
    region,
    product_category,
    SUM(sales_amount) as total_sales,
    COUNT(DISTINCT customer_id) as unique_customers
FROM sales_transactions
WHERE transaction_date >= current_date - interval '90' day
GROUP BY region, product_category;
```

自動更新を設定するには、ビュー定義に更新スケジュールを含めます。

```
CREATE MATERIALIZED VIEW sales_summary
SCHEDULE REFRESH EVERY 1 HOUR
AS
SELECT region, product_category, SUM(sales_amount) as total_sales
FROM sales_transactions
GROUP BY region, product_category;
```

マテリアライズドビューは、 `REFRESH MATERIALIZED VIEW` コマンドを使用していつでも手動で更新できます。

```
REFRESH MATERIALIZED VIEW sales_summary;
```

既存のマテリアライズドビューの更新スケジュールを変更するには、 `ALTER MATERIALIZED VIEW`ステートメントを使用します。

```
ALTER MATERIALIZED VIEW sales_summary
ADD SCHEDULE REFRESH EVERY 2 HOURS;
```

### ネストされたマテリアライズドビュー
<a name="materialized-views-nested"></a>

他のマテリアライズドビューをベーステーブルとして参照するマテリアライズドビューを作成し、複数ステージのデータ変換を有効にできます。ネストされたマテリアライズドビューを作成すると、 AWS Glue データカタログは依存関係を追跡し、マテリアライズドビュー階層を通じて更新を自動的に伝達します。ベースマテリアライズドビューが更新されると、それに依存するすべてのダウンストリームマテリアライズドビューがそれに応じて更新されます。

この機能を使用すると、複雑な変換を論理ステージに分解し、保守性を向上させ、データの鮮度要件に基づいて変換レイヤーを選択的に更新できます。

## ストレージとデータアクセス
<a name="materialized-views-storage-access"></a>

マテリアライズドビューは、事前計算された結果を Apache Iceberg テーブルとして S3 Tables バケットまたは AWS アカウント内の汎用 S3 バケットに保存します。 AWS Glue Data Catalog は、S3 Tables の自動最適化機能を通じて、圧縮やスナップショットの保持など、Iceberg テーブルのメンテナンスのあらゆる側面を管理します。

マテリアライズドビューは Iceberg テーブルとして保存されるため、Amazon Athena、Amazon Redshift、サードパーティーの分析プラットフォームなど、Iceberg 互換エンジンから直接読み取ることができます。このマルチエンジンアクセシビリティにより、事前計算されたデータは、データ重複や形式変換なしで分析エコシステム全体でアクセス可能になります。

## アクセス AWS Lake Formation 許可との統合
<a name="materialized-views-lake-formation"></a>

を使用して AWS Lake Formation 、マテリアライズドビューに対するきめ細かなアクセス許可を管理できます。ビュー作成者は自動的にマテリアライズドビューの所有者になり、 AWS Lake Formationの名前付きリソースメソッドまたは LF タグを使用して他のユーザーまたはロールにアクセス許可を付与できます。

マテリアライズドビューに対する`SELECT`アクセス許可をユーザーに付与すると、ユーザーは基盤となるソーステーブルにアクセスすることなく、事前に計算された結果をクエリできます。このセキュリティモデルは、データアクセス管理を簡素化し、最小特権の原則を実装して、ユーザーが必要とする特定のデータ変換にのみアクセスできるようにします。

 AWS Lake Formationのクロスアカウント共有機能を使用して、 AWS アカウント、 AWS 組織、組織単位間でマテリアライズドビューを共有できます。リソースリンクを使用して AWS リージョン間でマテリアライズドビューにアクセスすることもできます。これにより、分散データアクセスによる一元化されたデータガバナンスが可能になります。

## モニタリングとデバッグ
<a name="materialized-views-monitoring-debugging"></a>

 AWS Glue Data Catalog は、すべてのマテリアライズドビューの更新オペレーションと関連するメトリクスを Amazon CloudWatch に発行します。CloudWatch メトリクスを使用して、更新の開始時刻、終了時刻、期間、処理されたデータボリューム、更新ステータスをモニタリングできます。更新オペレーションが失敗すると、エラーメッセージと診断情報が CloudWatch Logs にキャプチャされます。

更新ジョブが予想期間を超えたとき、または繰り返し失敗したときに通知を受信するように CloudWatch アラームを設定できます。 AWS Glue データカタログは、更新実行の成功と失敗の両方について変更イベントを に発行するため、マテリアライズドビューオペレーションをより広範なワークフローオートメーションに統合できます。

マテリアライズドビューの現在のステータスを確認するには、`DESCRIBE MATERIALIZED VIEW`SQL コマンドを使用します。このコマンドは、古いステータス、最終更新タイムスタンプ、更新スケジュール設定などのメタデータを返します。

## 更新ジョブの管理
<a name="materialized-views-managing-refresh-jobs"></a>

### 手動更新の開始
<a name="materialized-views-manual-refresh"></a>

スケジュールされた間隔外に即時更新をトリガーします。

必要なアクセス許可: API コールを行うために使用される AWS 認証情報には、マテリアライズドビューに対する`glue:GetTable`アクセス許可が必要です。

S3 Tables Catalog の場合:

```
aws glue start-materialized-view-refresh-task-run \
    --catalog-id <ACCOUNT_ID>:s3tablescatalog/<CATALOG_NAME> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

ルートカタログの場合:

```
aws glue start-materialized-view-refresh-task-run \
    --catalog-id <ACCOUNT_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

### 更新ステータスの確認
<a name="materialized-views-checking-refresh-status"></a>

特定の更新ジョブのステータスを取得します。

```
aws glue get-materialized-view-refresh-task-run \
    --catalog-id <CATALOG_ID> \
    --materialized-view-refresh-task-run-id <TASK_RUN_ID>
```

### 更新履歴の一覧表示
<a name="materialized-views-listing-refresh-history"></a>

マテリアライズドビューのすべての更新ジョブを表示します。

```
aws glue list-materialized-view-refresh-task-runs \
    --catalog-id <CATALOG_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

**注記**  
S3 テーブル`<ACCOUNT_ID>:s3tablescatalog/<CATALOG_NAME>`の場合は 、ルートカタログ`<ACCOUNT_ID>`の場合は を使用します。

### 実行中の更新の停止
<a name="materialized-views-stopping-refresh"></a>

進行中の更新ジョブをキャンセルします。

```
aws glue stop-materialized-view-refresh-task-run \
    --catalog-id <CATALOG_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

## モニタリングとトラブルシューティング
<a name="materialized-views-monitoring-troubleshooting"></a>

マテリアライズドビューの更新ジョブをモニタリングするには、次の 3 つの方法があります。

### CloudWatch メトリクス
<a name="materialized-views-cloudwatch-metrics"></a>

CloudWatch のすべてのマテリアライズドビュー更新ジョブの集計メトリクスを表示します。

使用可能なメトリクス:
+ AWSディメンションを含む /Glue 名前空間:
  + CatalogId: カタログ識別子
  + DatabaseName: マテリアライズドビューを含むデータベース
  + TableName: マテリアライズドビュー名
  + TaskType: をMaterializedViewRefresh」に設定する

コンソールでの表示:

1. CloudWatch コンソール → メトリクスに移動する

1. Select AWS/Glue 名前空間

1. ディメンションでフィルタリング: CatalogId、DatabaseName、TableName、TaskType

1. ジョブの成功、失敗、期間に関するメトリクスを表示する

CloudWatch メトリクスクエリの例:

```
{AWS/Glue,CatalogId,DatabaseName,TableName,TaskType} MaterializedViewRefresh
```

の使用 AWS CLI:

```
aws cloudwatch get-metric-statistics \
    --namespace AWS/Glue \
    --metric-name <MetricName> \
    --dimensions Name=CatalogId,Value=<CATALOG_ID> \
                 Name=DatabaseName,Value=<DATABASE_NAME> \
                 Name=TableName,Value=<TABLE_NAME> \
                 Name=TaskType,Value=MaterializedViewRefresh \
    --start-time <START_TIME> \
    --end-time <END_TIME> \
    --period 3600 \
    --statistics Sum \
    --region <REGION>
```

### CloudWatch Logs
<a name="materialized-views-cloudwatch-logs"></a>

個々の更新タスク実行の詳細な実行ログを表示します。

ロググループ: `/aws-glue/materialized-views/<task_run_id>`

`<task_run_id>` は UUID (abc12345-def6-7890-ghij-klmnopqrstuv など) です。

ログの表示:

```
# List log streams for a task run
aws logs describe-log-streams \
    --log-group-name /aws-glue/materialized-views/<TASK_RUN_ID> \
    --region <REGION>

# Get log events
aws logs get-log-events \
    --log-group-name /aws-glue/materialized-views/<TASK_RUN_ID> \
    --log-stream-name <LOG_STREAM_NAME> \
    --region <REGION>
```

CloudWatch コンソールの場合:

1. CloudWatch → ロググループに移動する

1. /aws-glue/materialized-views/ の検索

1. タスク実行 ID を持つロググループを選択する

1. 詳細な実行ログ、エラー、Spark ジョブ出力を表示する

### 通知
<a name="materialized-views-eventbridge"></a>

更新ジョブの状態の変更に関するリアルタイム通知のイベントをサブスクライブします。

使用可能なイベントタイプ:
+ Glue マテリアライズドビューの更新タスクが開始されました
+ Glue マテリアライズドビューの更新タスクが正常に完了しました
+ Glue マテリアライズドビューの更新タスクに失敗しました
+ Glue マテリアライズドビューの自動更新呼び出しの失敗

ルールの作成:

```
aws events put-rule \
    --name materialized-view-refresh-notifications \
    --event-pattern '{
        "source": ["aws.glue"],
        "detail-type": [
            "Glue Materialized View Refresh Task Started",
            "Glue Materialized View Refresh Task Succeeded",
            "Glue Materialized View Refresh Task Failed",
            "Glue Materialized View Auto-Refresh Invocation Failure"
        ]
    }' \
    --region <REGION>
```

ターゲットの追加 (SNS トピックなど)

```
aws events put-targets \
    --rule materialized-view-refresh-notifications \
    --targets "Id"="1","Arn"="arn:aws:sns:<REGION>:<ACCOUNT_ID>:<TOPIC_NAME>" \
    --region <REGION>
```

### 更新ステータスの表示
<a name="materialized-views-refresh-status"></a>

 AWS Glue API を使用してマテリアライズドビューの更新ジョブのステータスを確認します。

```
aws glue get-materialized-view-refresh-task-run \
    --catalog-id <CATALOG_ID> \
    --materialized-view-refresh-task-run-id <TASK_RUN_ID> \
    --region <REGION>
```

または、最近のすべての更新実行を一覧表示します。

```
aws glue list-materialized-view-refresh-task-runs \
    --catalog-id <CATALOG_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME> \
    --region <REGION>
```

これは以下を示しています。
+ 最終更新時間
+ 更新ステータス (成功、失敗、実行中、停止)
+ タスク実行 ID
+ エラーメッセージ (失敗した場合)

一般的な更新状態:
+ RUNNING: 更新ジョブは現在実行中です
+ 成功: 更新が正常に完了しました
+ 失敗: 更新でエラーが発生しました
+ STOPPED: 更新が手動でキャンセルされました

更新失敗のトラブルシューティング:

更新が失敗した場合は、以下を確認してください。

1. IAM アクセス許可: 定義ロールがすべてのベーステーブルとマテリアライズドビューの場所にアクセスできることを確認します。

1. ベーステーブルの可用性: 参照されるすべてのテーブルが存在し、アクセス可能であることを確認する

1. クエリの有効性: SQL クエリが Spark SQL ダイアレクトに対して有効であることを確認する

1. リソース制限: アカウントの同時更新制限に達したかどうかを確認します。

GetMaterializedViewRefreshTaskRun API を使用して、詳細なエラーメッセージを取得します。

## 考慮事項と制限事項
<a name="materialized-views-considerations-limitations"></a>
+ マテリアライズドビューは、 AWS Glue データカタログに登録された Apache Iceberg テーブルをベーステーブルとしてのみ参照できます。
+ ビューの作成と自動クエリの書き換えは、Amazon Athena、Amazon EMR、および AWS Glue (バージョン 5.1) 全体で Apache Spark バージョン 3.5.6 以降の Spark エンジンでのみ使用できます。
+ マテリアライズドビューは、最終的にベーステーブルと一致します。更新ウィンドウ中に、マテリアライズドビューに直接アクセスするクエリが古いデータを返す場合があります。現在のデータにすぐにアクセスするには、手動更新を実行します。
+ 自動更新の最小間隔は 1 時間です。より頻繁な更新を必要とするユースケースでは、 `REFRESH MATERIALIZED VIEW` コマンドを使用してプログラムで手動更新を実行します。
+ クエリの書き換えでは、パフォーマンスよりも正確性が優先されます。マテリアライズドビューが古くなった場合、またはクエリ要件を正確に満たすことができない場合、Spark エンジンはベーステーブルに対して元のクエリを実行します。