

# Apache Iceberg テーブルをクエリする
<a name="querying-iceberg"></a>

Athena を利用して、Apache Iceberg テーブルに対して読み取り、タイムトラベル、書き込み、DDL クエリを実行できます。

[Apache Iceberg](https://iceberg.apache.org/) は、非常に大規模な分析データセット用のオープンテーブル形式です。Iceberg は、大量のファイルのコレクションをテーブルとして管理し、レコードレベルの挿入、更新、削除、タイムトラベルクエリなどの最新の分析データレイクオペレーションをサポートします。Iceberg の仕様では、スキーマやパーティションの進化などのテーブル進化をシームレスに行うことが可能であり、Amazon S3 での使用に最適化して設計されています。Iceberg は、同時書き込みシナリオでのデータの正確性の保証にも役立ちます。

Apache Iceberg の詳細については、[https://iceberg.apache.org/](https://iceberg.apache.org/) を参照してください。

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

Iceberg テーブルに対する Athena のサポートには、次の考慮事項と制限があります。
+ **Iceberg バージョンのサポート** – Athena は Apache Iceberg バージョン 1.4.2 をサポートします。
+ **Lake Formation に登録されたテーブル** – Athena は現在、Lake Formation に登録された Iceberg テーブルでの DDL 操作をサポートしていません。
+ **情報スキーマに対するクエリ** – Iceberg テーブルの情報スキーマをクエリする場合、Athena は列メタデータの信頼できるソースとして S3 メタデータを使用します。つまり、列情報はカタログメタデータからではなく、基盤となる S3 ファイルから取得されます。この動作は、カタログメタデータが列情報の主要なソースである可能性がある他のテーブル形式とは異なります。
+ **AWS Glue カタログのテーブルのみ** – [オープンソースの Glue カタログの実装](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)で定義されている仕様に基づく AWS Glue カタログに対して作成された Iceberg テーブルのみが Athena でサポートされています。
+ **AWS Glue によるテーブルロックのサポートのみ** – オープンソースの Glue カタログ実装はプラグインのカスタムロックをサポートしますが、Athena は AWS Glue オプティミスティックロックのみをサポートします。Athena を使用して他のロックが実装されている Iceberg テーブルを変更すると、データが失われ、トランザクションが中断する可能性があります。
+ **サポートされているファイル形式** – Athena エンジンバージョン 3 は、以下の Iceberg ファイル形式をサポートします。
  + Parquet
  + ORC
  + Avro
+ **Iceberg の制限付きメタデータ** – Lake Formation は Iceberg メタデータテーブルを評価しません。したがって、Iceberg メタデータテーブルは、ベーステーブルに Lake Formation の行もしくはセルフィルターが存在する場合、またはベーステーブル内のすべての列を表示するアクセス許可がない場合、制限されます。このような場合、`$partitions`、`$files`、`$manifests`、`$snapshots` Iceberg メタデータテーブルをクエリすると、失敗し、`AccessDeniedException` エラーが発生します。さらに、メタデータ列 `$path` には同じ Lake Formation の制限があり、クエリによって選択されると失敗します。Lake Formation フィルターに関係なく、他のすべてのメタデータテーブルをクエリできます。詳細については、「[メタデータテーブル](https://trino.io/docs/current/connector/iceberg.html#metadata-tables)」を参照してください。
+ **Iceberg v2 テーブル** – Athena は、Iceberg v2 テーブルを作成し、操作します。v1 テーブルと v2 テーブルの違いについては、Apache Iceberg ドキュメントの「[形式バージョンの変更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)」を参照してください。
+ **タイムゾーンのない時刻型の表示** – タイムゾーンのない時刻型とタイムスタンプ型は UTC で表示されます。時刻の列のフィルター式でタイムゾーンが指定されていない場合は、UTC が使用されます。
+ **タイムスタンプ関連のデータの精度** – Iceberg はタイムスタンプデータ型について、マイクロ秒精度をサポートしていますが、Athena は読み込みと書き込みの両方でタイムスタンプに対してミリ秒の精度しかサポートしていません。手動圧縮オペレーション中に書き換えられるデータについて、Athena は、時間関連の列でミリ秒の精度しか保持しません。
+ **サポートされていないオペレーション** - Iceberg テーブルに対して次の Athena オペレーションはサポートされていません。
  + [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ **ビュー** - [ビューを使用する](views.md) で説明されているように Athena ビューを作成する場合に `CREATE VIEW` を使用します。[Iceberg ビュー仕様](https://github.com/apache/iceberg/blob/master/format/view-spec.md)を使用してビューを作成することに興味がある場合は、[athena-feedback@amazon.com](mailto:athena-feedback@amazon.com) までご連絡ください。
+ **AWS Lake Formation でサポートされていない TTF 管理コマンド** — Lake Formation を使用して Apache Iceberg、Apache Hudi、Linux Foundation Delta Lake などのトランザクションテーブル形式 (TTF) の読み取りアクセス権限を管理できますが、Lake Formation を使用して `VACUUM`、`MERGE`、`UPDATE`、`OPTIMIZE` など、これらのテーブル形式を使用する操作の権限を管理することはできません。Lake Formation と Athena の統合の詳細については、「*AWS Lake Formation 開発者ガイド*」の「[Amazon Athena での AWS Lake Formation の使用](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html)」を参照してください。
+ **ネストされたフィールドによるパーティション分割** — ネストされたフィールドによるパーティション分割はサポートされていません。*これを実行しようとすると、「 NOT\$1SUPPORTED: Partitioning by nested field is unsupported: column\$1name*.*nested\$1field\$1name*」(未サポート: ネストされたフィールドによるパーティション分割はサポートされていません: column\$1name.nested\$1field\$1name) というメッセージが表示されます。
+ **Amazon Glacier オブジェクトのスキップはサポートされていません** – Apache Iceberg テーブル内のオブジェクトが Amazon Glacier ストレージクラスにある場合、`read_restored_glacier_objects` テーブルプロパティを `false` に設定しても効果はありません。

  例えば、次のコマンドを実行したとします。

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  Iceberg および Delta Lake テーブルでは、コマンドは「サポートされていないテーブルプロパティキー: read\$1restored\$1glacier\$1objects」というエラーを生成します。Hudi テーブルでは、`ALTER TABLE` コマンドはエラーを発生しませんが、Amazon Glacier オブジェクトはまだスキップされません。`ALTER TABLE` コマンドの後に `SELECT` クエリを実行すると、引き続きすべてのオブジェクトが返されます。

Athena でサポートしてほしい機能につきましては、[athena-feedback@amazon.com](mailto:athena-feedback@amazon.com) までご意見をお寄せください。

**Topics**
+ [考慮事項と制限事項](#querying-iceberg-considerations-and-limitations)
+ [Iceberg テーブルを作成する](querying-iceberg-creating-tables.md)
+ [Iceberg テーブルデータをクエリする](querying-iceberg-table-data.md)
+ [タイムトラベルとバージョントラベルのクエリを実行する](querying-iceberg-time-travel-and-version-travel-queries.md)
+ [Iceberg テーブルデータを更新する](querying-iceberg-updating-iceberg-table-data.md)
+ [Iceberg テーブルを管理する](querying-iceberg-managing-tables.md)
+ [Iceberg テーブルスキーマを進化させる](querying-iceberg-evolving-table-schema.md)
+ [Iceberg テーブルに対して他の DDL オペレーションを実行する](querying-iceberg-additional-operations.md)
+ [Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)
+ [AWS Glue Data Catalog マテリアライズドビューをクエリする](querying-iceberg-gdc-mv.md)
+ [Athena の Iceberg テーブルでサポートされているデータ型](querying-iceberg-supported-data-types.md)
+ [追加リソース](querying-iceberg-additional-resources.md)

# Iceberg テーブルを作成する
<a name="querying-iceberg-creating-tables"></a>

Athena で使用する Iceberg テーブルを作成するには、このページに記載されている `CREATE TABLE` ステートメントまたは AWS Glue クローラーを使用できます。

## CREATE TABLE ステートメントを使用する
<a name="querying-iceberg-creating-tables-query-editor"></a>

Athena は Iceberg v2 テーブルを作成します。v1 テーブルと v2 テーブルの違いについては、Apache Iceberg ドキュメントの「[形式バージョンの変更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)」を参照してください。

Athena `CREATE TABLE` は、データを含めずに Iceberg テーブルを作成します。テーブルで [Iceberg オープンソース Glue カタログ](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)が使用されている場合は、Apache Spark などの外部システムからテーブルを直接クエリできます。外部テーブルを作成する必要はありません。

**警告**  
`CREATE EXTERNAL TABLE` を実行すると、「External keyword not supported for table type ICEBERG」(テーブルタイプ ICEBERG では外部キーワードはサポートされていません) というエラーメッセージが表示されます。

Athena から Iceberg テーブルを作成するには、次に示す構文の概要のように、テーブルプロパティの `'table_type'` を `TBLPROPERTIES` 句の `'ICEBERG'` に設定します。

```
CREATE TABLE
  [db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
  [PARTITIONED BY (col_name | transform, ... )]
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' ='ICEBERG' [, property_name=property_value] )
```

Iceberg テーブルでクエリできるデータ型の詳細については、「[Athena の Iceberg テーブルでサポートされているデータ型](querying-iceberg-supported-data-types.md)」を参照してください。

### パーティションを使用する
<a name="querying-iceberg-partitioning"></a>

パーティションを持つ Iceberg テーブルを作成するには、`PARTITIONED BY` 構文を使用します。パーティション化に使用される列は、最初に列宣言で指定する必要があります。`PARTITIONED BY` 句には、列の型を含めることはできません。`CREATE TABLE` 構文に[パーティション変換](https://iceberg.apache.org/spec/#partition-transforms)を定義することもできます。パーティション化に複数の列を指定するには、次の例のように、列をカンマ (`,`) 文字で区切ります。

```
CREATE TABLE iceberg_table (id bigint, data string, category string)
  PARTITIONED BY (category, bucket(16, id))
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' = 'ICEBERG' )
```

次の表に、使用できるパーティション変換関数を示します。


****  

| 関数 | 説明 | サポートされている型 | 
| --- | --- | --- | 
| year(ts) | 年によるパーティション | date, timestamp | 
| month(ts) | 月によるパーティション | date, timestamp | 
| day(ts)  | 日によるパーティション | date, timestamp | 
| hour(ts) | 時間によるパーティション | timestamp | 
| bucket(N, col) | ハッシュ値 mod N のバケットによるパーティション これは、Hive テーブルのハッシュバケット作成と同じ概念です。 | int, long, decimal, date, timestamp, string, binary  | 
| truncate(L, col) | L に切り捨てられた値によるパーティション | int, long, decimal, string | 

Athena は Iceberg の隠しパーティション化をサポートしています。詳細については、「Apache Iceberg ドキュメント」の「[Iceberg's hidden partitioning](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)」(Iceberg の隠しパーティション化) を参照してください。

### テーブルプロパティを指定する
<a name="querying-iceberg-table-properties"></a>

このセクションでは、`CREATE TABLE` ステートメントの `TBLPROPERTIES` 句でキーと値のペアとして指定できるテーブルプロパティについて説明します。Athena では、Iceberg テーブルを作成または変更するために、テーブルプロパティで事前定義されたキーと値のペアのリストのみが使用できます。次の表に、指定可能なテーブルプロパティを示します。圧縮オプションの詳細については、このドキュメントの「[Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)」を参照してください。Athena による、特定のオープンソーステーブル設定プロパティのサポートをご希望の場合は、[athena-feedback@amazon.com](mailto:athena-feedback@amazon.com) までフィードバックをお送りください。

***format***


****  

|  |  | 
| --- |--- |
| 説明 | ファイルデータ形式 | 
| 使用できるプロパティ値 | サポートされるファイル形式と圧縮の組み合わせは、Athena エンジンのバージョンによって異なります。詳細については、「[Iceberg テーブル圧縮を使用する](compression-support-iceberg.md)」を参照してください。 | 
| デフォルト値: | parquet | 

***write\$1compression***


****  

|  |  | 
| --- |--- |
| 説明 | ファイル圧縮コーデック | 
| 使用できるプロパティ値 | サポートされるファイル形式と圧縮の組み合わせは、Athena エンジンのバージョンによって異なります。詳細については、「[Iceberg テーブル圧縮を使用する](compression-support-iceberg.md)」を参照してください。 | 
| デフォルト値: |  デフォルトの書き込み圧縮は Athena エンジンのバージョンによって異なります。詳細については、「[Iceberg テーブル圧縮を使用する](compression-support-iceberg.md)」を参照してください。  | 

***optimize\$1rewrite\$1data\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| 説明 | データ最適化固有の設定。最適化が必要なデータファイルの数が指定されたしきい値より少ない場合、データファイルは書き換えられません。これにより、蓄積するデータファイルの数を増やしてターゲットサイズに近いファイルを生成し、不要な計算をスキップしてコストを削減できます。 | 
| 使用できるプロパティ値 | 正数。50 未満にする必要があります。 | 
| デフォルト値: | 5 | 

***optimize\$1rewrite\$1delete\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| 説明 | データ最適化固有の設定。データファイルに関連付けられた削除ファイルの数がしきい値より少ない場合、データファイルは書き換えられません。これにより、データファイルごとに蓄積する削除ファイルの数を増やしてコストを削減できます。 | 
| 使用できるプロパティ値 | 正数。50 未満にする必要があります。 | 
| デフォルト値: | 2 | 

***vacuum\$1min\$1snapshots\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| 説明 |  テーブルのメインブランチに保持するスナップショットの最小数。 この値は `vacuum_max_snapshot_age_seconds` プロパティよりも優先されます。残りの最小スナップショット数が `vacuum_max_snapshot_age_seconds` で指定した経過日数よりも古い場合、そのスナップショットは保持され、`vacuum_max_snapshot_age_seconds` の値は無視されます。  | 
| 使用できるプロパティ値 | 正数。 | 
| デフォルト値: | 1 | 

***vacuum\$1max\$1snapshot\$1age\$1seconds***


****  

|  |  | 
| --- |--- |
| 説明 | メインブランチに保持するスナップショットの最大保存期間。vacuum\$1min\$1snapshots\$1to\$1keep で指定された残りの最小スナップショットが指定された経過日数よりも古い場合、この値は無視されます。このテーブル動作プロパティは、Apache Iceberg 設定の history.expire.max-snapshot-age-ms プロパティに対応しています。 | 
| 使用できるプロパティ値 | 正数。 | 
| デフォルト値: | 432,000 秒 (5 日間) | 

***vacuum\$1max\$1metadata\$1files\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| 説明 | 以前のメタデータファイルで、テーブルのメインブランチに保持するものの最大数。 | 
| 使用できるプロパティ値 | 正数。 | 
| デフォルト値: | 100 | 

***write\$1data\$1path\$1enabled***


****  

|  |  | 
| --- |--- |
| 説明 | true に設定すると、Iceberg テーブルは廃止された write.object-storage.path プロパティではなく write.data.path プロパティで作成されます。このオプションを使用して、廃止されたプロパティをサポートしなくなった Iceberg 1.9.0 以降との互換性を確保します。 | 
| 使用できるプロパティ値 | true, false | 
| デフォルト値: | false | 

### CREATE TABLE ステートメントの例
<a name="querying-iceberg-example-create-table-statement"></a>

次の例では、3 つの列を持つ Iceberg テーブルを作成します。

```
CREATE TABLE iceberg_table (
  id int,
  data string,
  category string) 
PARTITIONED BY (category, bucket(16,id)) 
LOCATION 's3://amzn-s3-demo-bucket/iceberg-folder' 
TBLPROPERTIES (
  'table_type'='ICEBERG',
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

## CREATE TABLE AS SELECT (CTAS) を使用する
<a name="querying-iceberg-creating-tables-ctas"></a>

この `CREATE TABLE AS` ステートメントを使用して Iceberg テーブルを作成する詳細については、[CTAS テーブルのプロパティ](create-table-as.md#ctas-table-properties) セクションに特に注目して「[CREATE TABLE AS](create-table-as.md)」を参照してください。

## AWS Glue クローラーを使用する
<a name="querying-iceberg-creating-tables-crawler"></a>

AWS Glue クローラーを使用すると、Iceberg テーブルを AWS Glue Data Catalog に自動的に登録できます。別の Iceberg カタログから移行する場合は、AWS Glue クローラーを作成してスケジュールし、Iceberg テーブルが配置されている Amazon S3 パスを指定できます。AWS Glue クローラーがトラバースできる Amazon S3 パスの最大の階層の深さを指定できます。クローラーをスケジュールすると、AWS Glue クローラーは実行するたびにスキーマ情報を抽出し、スキーマの変更で AWS Glue Data Catalog を更新します。AWS Glue クローラーは、複数のスナップショット間でスキーマのマージをサポートし、AWS Glue Data Catalog 内の最新のメタデータファイルの場所を更新します。詳細については、「[AWS Glue のデータカタログとクローラー](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)」を参照してください。

# Iceberg テーブルデータをクエリする
<a name="querying-iceberg-table-data"></a>

Iceberg データセットをクエリするには、次のような標準の `SELECT` ステートメントを使用します。クエリは Apache Iceberg [format v2 spec](https://iceberg.apache.org/spec/#format-versioning) に従い、位置と等価削除の両方の merge-on-read を実行します。

```
SELECT * FROM [db_name.]table_name [WHERE predicate]
```

クエリ時間を最適化するために、すべての述語がデータが存在する場所にプッシュダウンされます。

タイムトラベルとバージョントラベルのクエリについては、「[タイムトラベルとバージョントラベルのクエリを実行する](querying-iceberg-time-travel-and-version-travel-queries.md)」を参照してください。

## Iceberg テーブルでビューを作成およびクエリする
<a name="querying-iceberg-views"></a>

Iceberg テーブルで Athena ビューを作成してクエリするには、[ビューを使用する](views.md) で説明されている `CREATE VIEW` ビューを使用します。

例:

```
CREATE VIEW view1 AS SELECT * FROM iceberg_table
```

```
SELECT * FROM view1 
```

[Iceberg ビュー仕様](https://github.com/apache/iceberg/blob/master/format/view-spec.md)を使用してビューを作成することに興味がある場合は、[athena-feedback@amazon.com](mailto:athena-feedback@amazon.com) までご連絡ください。

## Iceberg テーブルデータをクエリする
<a name="querying-iceberg-table-metadata"></a>

`SELECT` クエリでは、*table\$1name* の後に次のプロパティを使用して Iceberg テーブルメタデータをクエリできます。
+ **\$1files** — テーブルの現在のデータファイルを表示します。
+ **\$1manifests** — テーブルの現在のファイルマニフェストを表示します。
+ **\$1history** — テーブルの履歴を表示します。
+ **\$1partitions** — テーブルの現在のパーティションを表示します。
+ **\$1snapshots** — テーブルのスナップショットを表示します。
+ **\$1refs** — テーブルのリファレンスを表示します。

### 例
<a name="querying-iceberg-table-metadata-syntax"></a>

次のステートメントは、Iceberg テーブルのファイルを一覧表示します。

```
SELECT * FROM "dbname"."tablename$files"
```

次のステートメントは、Iceberg テーブルのマニフェストを一覧表示します。

```
SELECT * FROM "dbname"."tablename$manifests" 
```

次のステートメントは、Iceberg テーブルの履歴を一覧表示します。

```
SELECT * FROM "dbname"."tablename$history"
```

以下は、Iceberg テーブルのパーティションを表示する例です。

```
SELECT * FROM "dbname"."tablename$partitions" 
```

以下は、Iceberg テーブルのスナップショットをリストする例です。

```
SELECT * FROM "dbname"."tablename$snapshots" 
```

以下は、Iceberg テーブルのリファレンスを表示する例です。

```
SELECT * FROM "dbname"."tablename$refs" 
```

## Lake Formation のきめ細かなアクセスコントロールを使用する
<a name="querying-iceberg-working-with-lf-fgac"></a>

Athena エンジンのバージョン 3 は、列レベルと行レベルのセキュリティアクセス制御を含む、Iceberg テーブルによる Lake Formation のきめ細かいアクセス制御をサポートしています。このアクセス制御は、タイムトラベルクエリやスキーマの進化を行ったテーブルを使用して機能します。詳細については、「[Lake Formation のきめ細かなアクセス制御と Athena ワークグループ](lf-athena-limitations.md#lf-athena-limitations-fine-grained-access-control)」を参照してください。

Athena 以外で Iceberg テーブルを作成した場合は、[Apache Iceberg SDK](https://iceberg.apache.org/releases/) バージョン 0.13.0 以降を使用して、Iceberg テーブルの列情報が AWS Glue Data Catalog に入力されるようにします。AWS Glue のIceberg テーブルに列情報が含まれていない場合は、Athena [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) ステートメントまたは最新の Iceberg SDK を使用してテーブルを修正し、AWS Glue の列情報を更新できます。

# タイムトラベルとバージョントラベルのクエリを実行する
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

各 Apache Iceberg テーブルは、それが含まれている Simple Storage Service (Amazon S3) オブジェクトのバージョン管理されたマニフェストを維持します。以前のバージョンのマニフェストを、タイムトラベルおよびバージョントラベルのクエリに使用できます。

Athena でのタイムトラベルクエリは、Amazon S3 での指定された日付と時刻における、一貫したスナップショットからの履歴データをクエリします。Athena でのバージョントラベルクエリは、Amazon S3 において指定されたスナップショット ID に関する履歴データをクエリします。

## タイムトラベルクエリ
<a name="querying-iceberg-time-travel-queries"></a>

タイムトラベルクエリを実行するには、次の例のように、`SELECT` ステートメントのテーブル名の後に `FOR TIMESTAMP AS OF timestamp` を使用します。

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp
```

タイムトラベルで指定されるシステム時刻は、タイムスタンプか、タイムゾーン付きタイムスタンプのいずれかです。これを指定しない場合、Athena は値を UTC 時間のタイムスタンプと見なします。

次のタイムトラベルクエリの例では、指定された日時の CloudTrail データを選択します。

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2020-01-01 10:00:00 UTC'
```

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)
```

## バージョントラベルクエリ
<a name="querying-iceberg-version-travel-queries"></a>

バージョントラベルクエリを実行する (つまり、指定したバージョンで一貫したスナップショットを表示する) には、次の例のように、`SELECT` ステートメントのテーブル名の後に `FOR VERSION AS OF version` を使用します。

```
SELECT * FROM [db_name.]table_name FOR VERSION AS OF version         
```

*version* パラメータは Iceberg テーブルバージョンに関連付けられている `bigint` スナップショット ID です。

次の例では、バージョントラベルクエリが、指定したバージョンのデータを選択しています。

```
SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
```

**注記**  
Athena エンジンのバージョン 2 で `FOR SYSTEM_TIME AS OF` および `FOR SYSTEM_VERSION AS OF` の句は、Athena エンジンバージョン 3 の `FOR TIMESTAMP AS OF` および `FOR VERSION AS OF` の句に置き換えられました。

### スナップショット ID を取得する
<a name="querying-iceberg-table-snapshot-id"></a>

以下の例にあるように、Iceberg が提供する Java [SnapshotUtil](https://iceberg.apache.org/javadoc/1.6.0/org/apache/iceberg/util/SnapshotUtil.html) クラスを使用して、Iceberg スナップショット ID を取得することができます。

```
import org.apache.iceberg.Table;
import org.apache.iceberg.aws.glue.GlueCatalog;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.util.SnapshotUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

Catalog catalog = new GlueCatalog();

Map<String, String> properties = new HashMap<String, String>();
properties.put("warehouse", "s3://amzn-s3-demo-bucket/my-folder");
catalog.initialize("my_catalog", properties);

Date date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse("2022/01/01 00:00:00");
long millis = date.getTime();

TableIdentifier name = TableIdentifier.of("db", "table");
Table table = catalog.loadTable(name);
long oldestSnapshotIdAfter2022 = SnapshotUtil.oldestAncestorAfter(table, millis);
```

## タイムおよびバージョントラベルを組み合わせる
<a name="querying-iceberg-combining-time-and-version-travel"></a>

次の例のように、同じクエリでタイムトラベルとバージョントラベルの構文を使用することで、時間とバージョニングに対し異なる条件を指定できます。

```
SELECT table1.*, table2.* FROM 
  [db_name.]table_name FOR TIMESTAMP AS OF (current_timestamp - interval '1' day) AS table1 
  FULL JOIN 
  [db_name.]table_name FOR VERSION AS OF 5487432386996890161 AS table2 
  ON table1.ts = table2.ts 
  WHERE (table1.id IS NULL OR table2.id IS NULL)
```

# Iceberg テーブルデータを更新する
<a name="querying-iceberg-updating-iceberg-table-data"></a>

`INSERT`、`UPDATE`、`DELETE` クエリを使用して、Athena で Iceberg テーブルデータを直接管理できます。データ管理トランザクションごとに新しいスナップショットが生成され、タイムトラベルを使用してクエリできます。`UPDATE` および `DELETE` ステートメントは、Iceberg 形式 v2 の行レベル [position delete](https://iceberg.apache.org/spec/#position-delete-files) 仕様に従い、スナップショットを分離します。

**注記**  
Athena SQL は現在、コピーオンライトアプローチをサポートしていません。`UPDATE`、`MERGE INTO`、および `DELETE FROM` オペレーションでは、指定したテーブルプロパティに関係なく、位置削除で常にマージオンリードアプローチを使用します。`write.update.mode`、`write.merge.mode`、`write.delete.mode` などのテーブルプロパティを設定してコピーオンライトを使用する場合、Athena はそれらを無視してマージオンリードを引き続き使用するため、クエリは失敗しません。

次のコマンドを使用して、Iceberg テーブルでデータ管理オペレーションを実行します。

**Topics**
+ [INSERT INTO](querying-iceberg-insert-into.md)
+ [DELETE](querying-iceberg-delete.md)
+ [UPDATE](querying-iceberg-update.md)
+ [MERGE INTO](querying-iceberg-merge-into.md)

# INSERT INTO
<a name="querying-iceberg-insert-into"></a>

Iceberg テーブルにデータを挿入します。Athena Iceberg `INSERT INTO` は、現在の `INSERT INTO` が外部 Hive テーブルに対してクエリする場合と同じく、スキャンしたデータ量の分だけ課金されます。Iceberg テーブルにデータを挿入するには、次の構文を使用します。*query* は `VALUES (val1, val2, ...)` または `SELECT (col1, col2, …) FROM [db_name.]table_name WHERE predicate` のいずれかです。SQL 構文とセマンティクスの詳細については、「[INSERT INTO](insert-into.md)」を参照してください。

```
INSERT INTO [db_name.]table_name [(col1, col2, …)] query
```

次の例では、テーブル `iceberg_table` に値を挿入します。

```
INSERT INTO iceberg_table VALUES (1,'a','c1')
```

```
INSERT INTO iceberg_table (col1, col2, ...) VALUES (val1, val2, ...)
```

```
INSERT INTO iceberg_table SELECT * FROM another_table
```

# DELETE
<a name="querying-iceberg-delete"></a>

Athena Iceberg `DELETE` は、Iceberg 位置削除ファイルをテーブルに書き込みます。これは、読み込み時マージ削除と呼ばれます。コピーオンライト削除とは対照的に、ファイルデータを書き換えないため、読み込み時マージ削除のほうが効率的です。Athena は、Iceberg データを読み込むときに、Iceberg 位置削除ファイルをデータファイルとマージして、テーブルの最新のビューを生成します。こうした位置削除ファイルを削除するには、[REWRITE DATA 圧縮アクション](querying-iceberg-data-optimization.md#querying-iceberg-data-optimization-rewrite-data-action)を実行します。`DELETE` オペレーションは、スキャンしたデータ量の分だけ課金されます。構文については、「[DELETE](delete-statement.md)」を参照してください。

次の例では、`category` の値が `c3` の `iceberg_table` から行を削除します。

```
DELETE FROM iceberg_table WHERE category='c3'
```

# UPDATE
<a name="querying-iceberg-update"></a>

Athena Iceberg `UPDATE` は、Iceberg 位置削除ファイルと新しく更新された行を同じトランザクション内のデータファイルとして書き込みます。`UPDATE` は、`INSERT INTO` と `DELETE` を組み合わせたものと考えることができます。`UPDATE` オペレーションは、スキャンしたデータ量の分だけ課金されます。構文については、「[UPDATE](update-statement.md)」を参照してください。

次の例では、テーブル `iceberg_table` の指定された値を更新します。

```
UPDATE iceberg_table SET category='c2' WHERE category='c1'
```

# MERGE INTO
<a name="querying-iceberg-merge-into"></a>

条件付きで Iceberg テーブルに行を更新、削除、または挿入します。単一のステートメントで、更新、削除、挿入のアクションを組み合わせることができます。構文については、「[MERGE INTO](merge-into-statement.md)」を参照してください。

**注記**  
`MERGE INTO` はトランザクションで、Athena エンジンバージョン 3 の Apache Iceberg テーブルでのみサポートされています。

次の例では、ソーステーブル `s` にあるテーブル `t` からすべての顧客を削除します。

```
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
```

次の例では、ソーステーブル `s` の顧客情報でターゲットテーブル `t` を更新します。テーブル `s` 内の顧客の行が一致する顧客行が `t` にある場合、この例ではテーブル t の購入をインクリメントします。テーブル `t` がテーブル `s` 内の顧客の行と一致しない場合、この例では、顧客の行をテーブル `s` からテーブル `t` に挿入します。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED
        THEN UPDATE SET purchases = s.purchases + t.purchases
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

次の例では、ソーステーブル `s` の情報でターゲットテーブル `t` を条件付きで更新します。この例では、送信元アドレスが Centreville である一致するターゲット行をすべて削除します。一致するすべての行について、この例では送信元購入を追加し、ターゲットアドレスを送信元アドレスに設定します。ターゲットテーブルに一致するものがない場合、この例では送信元テーブルから行を挿入します。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED AND s.address = 'Centreville'
        THEN DELETE
    WHEN MATCHED
        THEN UPDATE
            SET purchases = s.purchases + t.purchases, address = s.address
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

# Iceberg テーブルを管理する
<a name="querying-iceberg-managing-tables"></a>

Athena は、Iceberg テーブルに対して次のテーブル DDL オペレーションをサポートしています。

**Topics**
+ [ALTER TABLE RENAME](querying-iceberg-alter-table-rename.md)
+ [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md)
+ [ALTER TABLE UNSET TBLPROPERTIES](querying-iceberg-alter-table-unset-properties.md)
+ [DESCRIBE](querying-iceberg-describe-table.md)
+ [DROP TABLE](querying-iceberg-drop-table.md)
+ [SHOW CREATE TABLE](querying-iceberg-show-create-table.md)
+ [SHOW TBLPROPERTIES](querying-iceberg-show-table-properties.md)

# ALTER TABLE RENAME
<a name="querying-iceberg-alter-table-rename"></a>

テーブル名を変更します。

Iceberg テーブルのテーブルメタデータが Simple Storage Service (Amazon S3) に保存されるため、基礎となるテーブル情報に影響を与えることなく、Iceberg マネージドテーブルのデータベース名とテーブル名を更新できます。

## 概要
<a name="querying-iceberg-alter-table-rename-synopsis"></a>

```
ALTER TABLE [db_name.]table_name RENAME TO [new_db_name.]new_table_name
```

## 例
<a name="querying-iceberg-alter-table-rename-example"></a>

```
ALTER TABLE my_db.my_table RENAME TO my_db2.my_table2
```

# ALTER TABLE SET TBLPROPERTIES
<a name="querying-iceberg-alter-table-set-properties"></a>

プロパティを Iceberg テーブルに追加し、割り当てられた値を設定します。

[Iceberg 仕様](https://iceberg.apache.org/#spec/#table-metadata-fields)に従って、テーブルプロパティは、AWS Glue ではなく、Iceberg テーブルメタデータファイルに保存されます。Athena はカスタムテーブルプロパティを受け入れません。使用できるキーと値のペアついては、「[テーブルプロパティを指定する](querying-iceberg-creating-tables.md#querying-iceberg-table-properties)」セクションを参照してください。`ALTER TABLE SET TBLPROPERTIES` および `ALTER TABLE UNSET TBLPROPERTIES` を使用して、`write.data.path` および `write.object-storage.path` Iceberg テーブルのプロパティを設定または削除することもできます。Athena による、特定のオープンソーステーブル設定プロパティのサポートをご希望の場合は、[athena-feedback@amazon.com](mailto:athena-feedback@amazon.com) までフィードバックをお送りください。

## 概要
<a name="querying-iceberg-alter-table-set-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## 例
<a name="querying-iceberg-alter-table-set-properties-example"></a>

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

次の例では、既存の Iceberg テーブルに `write.data.path` プロパティを設定します。

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'write.data.path'='s3://amzn-s3-demo-bucket/your-folder/data'
)
```

# ALTER TABLE UNSET TBLPROPERTIES
<a name="querying-iceberg-alter-table-unset-properties"></a>

Iceberg テーブルから既存のプロパティを削除します。

## 概要
<a name="querying-iceberg-alter-table-unset-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name UNSET TBLPROPERTIES ('property_name' [ , ... ])
```

## 例
<a name="querying-iceberg-alter-table-unset-properties-example"></a>

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write_compression')
```

次の例では、Iceberg テーブルから `write.data.path` プロパティを削除します。

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write.data.path')
```

# DESCRIBE
<a name="querying-iceberg-describe-table"></a>

テーブル情報の説明です。

## 概要
<a name="querying-iceberg-describe-table-synopsis"></a>

```
DESCRIBE [FORMATTED] [db_name.]table_name
```

`FORMATTED` オプションを指定すると、テーブルの場所やプロパティなどの追加情報が出力に表示されます。

## 例
<a name="querying-iceberg-describe-table-example"></a>

```
DESCRIBE iceberg_table
```

# DROP TABLE
<a name="querying-iceberg-drop-table"></a>

Iceberg テーブルを削除します。

**警告**  
Athena では Iceberg テーブルがマネージドテーブルと見なされるため、Iceberg テーブルを削除すると、テーブル内のデータもすべて削除されます。

## 概要
<a name="querying-iceberg-drop-table-synopsis"></a>

```
DROP TABLE [IF EXISTS] [db_name.]table_name
```

## 例
<a name="querying-iceberg-drop-table-example"></a>

```
DROP TABLE iceberg_table
```

# SHOW CREATE TABLE
<a name="querying-iceberg-show-create-table"></a>

`CREATE TABLE` DDL ステートメントを表示します。Athena で Iceberg テーブルを再作成するために使用できます。Athena がテーブル構造を再現できない場合 (たとえば、テーブルにカスタムテーブルプロパティが指定されているため)、「UNSUPPORTED」(サポートされていません) というエラーがスローされます。

## 概要
<a name="querying-iceberg-show-create-table-synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## 例
<a name="querying-iceberg-show-create-table-example"></a>

```
SHOW CREATE TABLE iceberg_table
```

# SHOW TBLPROPERTIES
<a name="querying-iceberg-show-table-properties"></a>

Iceberg テーブルのテーブルプロパティを 1 つ以上表示します。Athena でサポートされているテーブルプロパティのみが表示されます。

## 概要
<a name="querying-iceberg-show-table-properties-synopsis"></a>

```
SHOW TBLPROPERTIES [db_name.]table_name [('property_name')]
```

## 例
<a name="querying-iceberg-show-table-properties-example"></a>

```
SHOW TBLPROPERTIES iceberg_table
```

# Iceberg テーブルスキーマを進化させる
<a name="querying-iceberg-evolving-table-schema"></a>

Iceberg スキーマの更新は、メタデータのみの変更です。スキーマの更新を実行しても、データファイルは変更されません。

Iceberg 形式では、次のスキーマ進化の変更がサポートされています。
+ **Add** – 新しい列をテーブルまたはネストされた `struct` に追加します。
+ **Drop** – 既存の列をテーブルまたはネストされた `struct` から削除します。
+ **Rename** – 既存の列またはネストされた `struct` のフィールドの名前を変更します。
+ **順序変更** - 列の順序を変更します。
+  **型昇格** – 列、`struct` フィールド、`map` キー、`map` 値、または `list` 要素の型を広げます。Iceberg テーブルでは、現時点で次のケースがサポートされています。
  + 整数から大きな整数
  + 浮動小数点から倍精度浮動小数点
  + 10 進数型の精度を上げる

このセクションの DDL ステートメントを使用して Iceberg テーブルスキーマを変更できます。

**Topics**
+ [ALTER TABLE ADD COLUMNS](querying-iceberg-alter-table-add-columns.md)
+ [ALTER TABLE DROP COLUMN](querying-iceberg-alter-table-drop-column.md)
+ [ALTER TABLE CHANGE COLUMN](querying-iceberg-alter-table-change-column.md)
+ [SHOW COLUMNS](querying-iceberg-show-columns.md)

# ALTER TABLE ADD COLUMNS
<a name="querying-iceberg-alter-table-add-columns"></a>

既存の Iceberg テーブルに 1 つまたは複数の列を追加します。

## 概要
<a name="querying-iceberg-alter-table-add-columns-synopsis"></a>

```
ALTER TABLE [db_name.]table_name ADD COLUMNS (col_name data_type [,...])
```

## 例
<a name="querying-iceberg-alter-table-add-columns-example"></a>

次の例では、`string` 型の `comment` 列を Iceberg テーブルに追加しています。

```
ALTER TABLE iceberg_table ADD COLUMNS (comment string)
```

次の例では、`struct` 型の `point` 列を Iceberg テーブルに追加しています。

```
ALTER TABLE iceberg_table 
ADD COLUMNS (point struct<x: double, y: double>)
```

次の例では、構造体の配列である `points` 列を Iceberg テーブルに追加しています。

```
ALTER TABLE iceberg_table 
ADD COLUMNS (points array<struct<x: double, y: double>>)
```

# ALTER TABLE DROP COLUMN
<a name="querying-iceberg-alter-table-drop-column"></a>

既存の Iceberg テーブルから列を削除します。

## 概要
<a name="querying-iceberg-alter-table-drop-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name DROP COLUMN col_name
```

## 例
<a name="querying-iceberg-alter-table-drop-column-example"></a>

```
ALTER TABLE iceberg_table DROP COLUMN userid
```

# ALTER TABLE CHANGE COLUMN
<a name="querying-iceberg-alter-table-change-column"></a>

Iceberg テーブルの列の名前、タイプ、順序、またはコメントを変更します。

**注記**  
`ALTER TABLE REPLACE COLUMNS` はサポートされていません。`REPLACE COLUMNS` は、すべての列を削除してから新しい列を追加するため、Iceberg ではサポートされていません。`CHANGE COLUMN` は、スキーマ進化に推奨される構文です。

## 概要
<a name="querying-iceberg-alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## 例
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
ALTER TABLE iceberg_table CHANGE comment blog_comment string AFTER id
```

# SHOW COLUMNS
<a name="querying-iceberg-show-columns"></a>

テーブル内の列を表示します。

## 概要
<a name="querying-iceberg-show-columns-synopsis"></a>

```
SHOW COLUMNS (FROM|IN) [db_name.]table_name
```

## 例
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
SHOW COLUMNS FROM iceberg_table
```

# Iceberg テーブルに対して他の DDL オペレーションを実行する
<a name="querying-iceberg-additional-operations"></a>

[Iceberg テーブルスキーマを進化させる](querying-iceberg-evolving-table-schema.md) で説明されているスキーマ進化オペレーションに加えて、Athena の Apache Iceberg テーブルに対して次の DDL オペレーションを実行することもできます。

## データベースレベルのオペレーション
<a name="querying-iceberg-additional-operations-database-level-operations"></a>

`CASCADE` オプションを指定して [DROP DATABASE](drop-database.md) を使用すると、Iceberg テーブルデータも削除されます。次の DDL オペレーションは、Iceberg テーブルには影響しません。
+ [CREATE DATABASE](create-database.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW VIEWS](show-views.md)

## パーティション関連のオペレーション
<a name="querying-iceberg-additional-operations-partition-related-operations"></a>

Iceberg テーブルでは[隠しパーティション化](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)が使用されるため、物理パーティションを直接操作する必要はありません。そのため、Athena の Iceberg テーブルでは、次のパーティション関連の DDL オペレーションがサポートされていません。
+ [SHOW PARTITIONS](show-partitions.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)

Athena での Iceberg [パーティションの進化](https://iceberg.apache.org/docs/latest/evolution/#partition-evolution)についてご意見がございましたら、[athena-feedback@amazon.com](mailto:athena-feedback@amazon.com) までお寄せください。

## Iceberg テーブルをアンロードする
<a name="querying-iceberg-additional-operations-unload-iceberg-table"></a>

Iceberg テーブルは、Simple Storage Service (Amazon S3) のフォルダ内のファイルにアンロードできます。詳細については、「[UNLOAD](unload.md)」を参照してください。

## MSCK REPAIR
<a name="querying-iceberg-additional-operations-msck-repair"></a>

Iceberg テーブルではテーブルレイアウト情報が追跡されるため、Hive テーブルの場合のような [MSCK REPAIR TABLE](msck-repair-table.md) の実行は必要なく、サポートもされていません。

# Iceberg テーブルを最適化する
<a name="querying-iceberg-data-optimization"></a>

Athena には、Apache Iceberg テーブルのクエリパフォーマンスを向上させるための最適化機能がいくつか用意されています。データが蓄積されると、ファイル処理のオーバーヘッドが増加し、Iceberg 削除ファイルに保存されている行レベルの削除を適用する際の計算コストが高くなるため、クエリの効率が低下する可能性があります。これらの課題に対応するため、Athena はテーブル構造を最適化するための手動の圧縮演算子と真空演算子をサポートしています。また、Athena は Iceberg 統計と連携すると、クエリ実行中の正確なデータプルーニングを目的としたコストベースのクエリ最適化と Parquet 列インデックス作成も実行できます。これらの機能は連携して、クエリの実行時間を短縮し、データスキャンを最小限に抑え、コストを削減します。このトピックでは、これらの最適化機能を使用して Iceberg テーブルで高性能クエリを維持する方法について説明します。

## OPTIMIZE
<a name="querying-iceberg-data-optimization-rewrite-data-action"></a>

`OPTIMIZE table REWRITE DATA` 圧縮アクションは、関連する削除ファイルのサイズと数に基づいて、データファイルをより最適化されたレイアウトに書き換えます。構文とテーブルプロパティの詳細については、「[OPTIMIZE](optimize-statement.md)」を参照してください。

### 例
<a name="querying-iceberg-data-optimization-example"></a>

次の例では、削除ファイルをデータファイルにマージし、ターゲットファイルサイズに近いファイルを生成します。ここでは、`category` の値が `c1` です。

```
OPTIMIZE iceberg_table REWRITE DATA USING BIN_PACK
  WHERE category = 'c1'
```

## VACUUM
<a name="querying-iceberg-vacuum"></a>

`VACUUM` は[スナップショットの有効期限切れ](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)と[孤立ファイルの削除](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)を行います。これらのアクションにより、メタデータのサイズが小さくなり、現在のテーブル状態にないファイルのうち、テーブル用に指定された保持期間よりも古いファイルが削除されます。構文の詳細については、「[VACUUM](vacuum-statement.md)」を参照してください。

### 例
<a name="querying-iceberg-vacuum-example"></a>

次の例では、テーブルプロパティを使用して過去 3 日間のデータを保持するようにテーブル `iceberg_table` を設定し、`VACUUM` を使用して古いスナップショットを期限切れにし、孤立ファイルをテーブルから削除します。

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'vacuum_max_snapshot_age_seconds'='259200'
)

VACUUM iceberg_table
```

## Iceberg テーブル統計を使用する
<a name="querying-iceberg-data-optimization-statistics"></a>

Athena のコストベースのオプティマイザは Iceberg 統計を使用して最適なクエリプランを作成します。Iceberg テーブルの統計が生成されると、Athena はこの情報を自動的に使用して、結合の順序、フィルター、集約動作に関するインテリジェントな決定を行い、それによって多くの場合、クエリのパフォーマンスを向上させ、コストを削減します。

S3 Tables を使用すると、Iceberg 統計はデフォルトで有効になります。他の Iceberg テーブルの場合、Athena はテーブルプロパティ `use_iceberg_statistics` を使用して、コストベースの最適化に統計を活用するかどうかを決定します。開始するには、「*AWS Glue ユーザーガイド*」の「[列統計を使用したクエリパフォーマンスの最適化](https://docs.aws.amazon.com//glue/latest/dg/column-statistics.html)」を参照するか、[Athena コンソール](https://docs.aws.amazon.com/athena/latest/ug/cost-based-optimizer.html)を使用して Iceberg テーブルでオンデマンド統計を生成します。

## Parquet 列インデックス作成を使用する
<a name="querying-iceberg-data-optimization-parquet-column-indexing"></a>

Parquet 列インデックス作成を使用すると、Athena は行グループレベルの統計に加えてページレベルの最小/最大統計を活用することで、クエリの実行中により正確なデータプルーニングを実行できます。これにより、Athena は行グループ内の不要なページをスキップできるようになり、スキャンされるデータ量が大幅に削減され、クエリのパフォーマンスが向上します。ソートされた列に選択的フィルター述語があるクエリに最適です。Athena が Amazon S3 から読み取る必要があるデータの量を減らすと同時に、実行時間とデータスキャン効率の両方を向上させます。

基盤となる Parquet ファイルに列インデックスが存在する場合、Athena はデフォルトで S3 Tables とともに Parquet 列インデックスを使用します。他の Iceberg テーブルの場合、Athena は `use_iceberg_parquet_column_index` プロパティを使用して、Parquet ファイル内の列インデックスを使用するかどうかを決定します。AWS Glue コンソールまたは `UpdateTable` API を使用して、このテーブルプロパティを設定します。

# AWS Glue Data Catalog マテリアライズドビューをクエリする
<a name="querying-iceberg-gdc-mv"></a>

Athena では、AWS Glue Data Catalog マテリアライズドビューをクエリできます。Glue Data Catalog のマテリアライズドビューには、SQL クエリの事前計算された結果が Apache Iceberg テーブルとして保存されます。

Amazon EMR または AWS Glue で Apache Spark を使用して Glue Data Catalog マテリアライズドビューを作成すると、ビュー定義とメタデータが AWS Glue Data Catalog に保存されます。事前計算された結果は、Apache Iceberg テーブルとして Amazon S3 に保存されます。通常の Iceberg テーブルをクエリする場合と同様に、標準の SQL `SELECT` ステートメントを使用して Athena からこれらのマテリアライズドビューをクエリできます。

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

Athena でマテリアライズドビューをクエリする前に、以下を確認してください。
+ マテリアライズドビューは AWS Glue データカタログに存在しており、Apache Spark (Amazon EMR リリース 7.12.0 以降、または AWS Glue バージョン 5.1 以降) を使用して作成されている
+ Athena でマテリアライズドビューをクエリするために必要な AWS Lake Formation 許可：
  + マテリアライズドビューにおける `SELECT` 許可
  + マテリアライズドビューにおける `DESCRIBE` 許可
  + マテリアライズドビューのデータが保存されており基盤となっている Amazon S3 の場所へのアクセス許可
+ マテリアライズドビューの基本的なデータは、Amazon S3 Table バケットまたは Amazon S3 汎用バケットに保存される
+ マテリアライズドビューを含む AWS Glue Data Catalog データベースへのアクセス許可がある
+ Amazon S3 Tables バケットに保存されているマテリアライズドビューの場合、S3 Tables カタログにアクセスするために必要な許可が自身の IAM ロールにある

## 考慮事項と制限事項
<a name="querying-iceberg-gdc-mv-considerations"></a>
+ Athena は、マテリアライズドビューでのオペレーション (`ALTER`、`CREATE MATERIALIZED VIEW`、`REFRESH MATERIALIZED VIEW`、`DROP`、`INSERT`、`UPDATE`、`MERGE`、`DELETE`、`OPTIMIZE`、`VACUUM`) をサポートしません。マテリアライズドビューを作成するには、Amazon EMR または AWS Glue で Apache Spark を使用してください。リフレッシュオペレーションは、AWS Glue Data Catalog API または Apache Spark を使用して実行する必要があります。Apache Spark を使用してマテリアライズドビューに変更を加えます。

## マテリアライズドビューのクエリ
<a name="querying-iceberg-gdc-mv-operations"></a>

Athena は、マテリアライズドビューを読み取りオペレーション用の標準 Iceberg テーブルとして扱い、特別な構文や設定変更を必要とすることなく、事前に計算されたデータにアクセスできます。

Athena でマテリアライズドビューをクエリするには、標準的な `SELECT` ステートメントを使用します。

```
SELECT * FROM my_database.sales_summary_mv;
```

通常のテーブルと同様に、フィルター、集計、結合を適用できます。

```
SELECT
  region,
  SUM(total_sales) as sales_total
FROM my_database.sales_summary_mv
WHERE year = 2025
GROUP BY region
ORDER BY sales_total DESC;
```

## サポートされているオペレーション
<a name="querying-iceberg-gdc-mv-supported"></a>

Athena は、マテリアライズドビューでの次のオペレーションをサポートしています。
+ `SELECT` クエリ - 標準 SQL `SELECT` ステートメントを使用してマテリアライズドビューからデータを読み取る
+ `DESCRIBE` - マテリアライズドビューのスキーマとメタデータを表示する
+ `SHOW TABLES` - データベース内の他のテーブルとともにマテリアライズドビューを一覧表示する
+ `JOIN` オペレーション - マテリアライズドビューを他のテーブルまたはビューに結合する
+ フィルタリングと集計 - `WHERE` 句、`GROUP BY`、集計関数を適用する

# Athena の Iceberg テーブルでサポートされているデータ型
<a name="querying-iceberg-supported-data-types"></a>

Athena は、次のデータ型が含まれている Iceberg テーブルをクエリできます。

```
binary
boolean
date
decimal
double
float
int
list
long
map
string
struct
timestamp without time zone
```

Iceberg テーブル型の詳細については、Apache のドキュメントの [Iceberg の「Schemas」ページ](https://iceberg.apache.org/docs/latest/schemas/)を参照してください。

次の表に、Athena のデータ型と Iceberg のテーブルデータ型の関係を示します。


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/querying-iceberg-supported-data-types.html)

Athena でのデータ型の詳細については、「[Amazon Athena のデータ型](data-types.md)」を参照してください。

# 追加リソース
<a name="querying-iceberg-additional-resources"></a>

次の記事は、AWS 規範的ガイダンスのドキュメントに記載されています。
+ [Working with Apache Iceberg tables by using Amazon Athena SQL](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-athena.html) 

Apache Iceberg テーブルで Athena を使用する方法の詳細記事については、「AWS Big Data Blog」の以下の投稿を参照してください。
+ [Implement a serverless CDC process with Apache Iceberg using Amazon DynamoDB and Amazon Athena](https://aws.amazon.com/blogs/big-data/implement-a-serverless-cdc-process-with-apache-iceberg-using-amazon-dynamodb-and-amazon-athena/) 
+ [Accelerate data science feature engineering on transactional data lakes using Amazon Athena with Apache Iceberg](https://aws.amazon.com/blogs/big-data/accelerate-data-science-feature-engineering-on-transactional-data-lakes-using-amazon-athena-with-apache-iceberg/) 
+ [Amazon Athena、Amazon EMR、および AWS Glue を使用した Apache Iceberg データレイクの構築](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) 
+ [Perform upserts in a data lake using Amazon Athena and Apache Iceberg](https://aws.amazon.com/blogs/big-data/perform-upserts-in-a-data-lake-using-amazon-athena-and-apache-iceberg/) 
+ [Build a transactional data lake using Apache Iceberg, AWS Glue, and cross-account data shares using AWS Lake Formation and Amazon Athena](https://aws.amazon.com/blogs/big-data/build-a-transactional-data-lake-using-apache-iceberg-aws-glue-and-cross-account-data-shares-using-aws-lake-formation-and-amazon-athena/) 
+ [Use Apache Iceberg in a data lake to support incremental data processing](https://aws.amazon.com/blogs/big-data/use-apache-iceberg-in-a-data-lake-to-support-incremental-data-processing/) 
+ [Build a real-time GDPR-aligned Apache Iceberg data lake](https://aws.amazon.com/blogs/big-data/build-a-real-time-gdpr-aligned-apache-iceberg-data-lake/) 
+ [Automate replication of relational sources into a transactional data lake with Apache Iceberg and AWS Glue](https://aws.amazon.com/blogs/big-data/automate-replication-of-relational-sources-into-a-transactional-data-lake-with-apache-iceberg-and-aws-glue/) 
+ [Interact with Apache Iceberg tables using Amazon Athena and cross account fine-grained permissions using AWS Lake Formation](https://aws.amazon.com/blogs/big-data/interact-with-apache-iceberg-tables-using-amazon-athena-and-cross-account-fine-grained-permissions-using-aws-lake-formation/) 
+ [Build a serverless transactional data lake with Apache Iceberg, Amazon EMR Serverless, and Amazon Athena](https://aws.amazon.com/blogs/big-data/build-a-serverless-transactional-data-lake-with-apache-iceberg-amazon-emr-serverless-and-amazon-athena/) 