

# タイムトラベルとバージョントラベルのクエリを実行する
<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)
```