

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 執行時間歷程和版本歷程查詢
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

每個 Apache Iceberg 資料表都會有一份其所含 Amazon S3 物件的版本資訊清單。使用過往的版本資訊清單可查詢時間歷程和版本歷程。

Athena 中的時間歷程查詢可在 Simple Storage Service (Amazon S3) 中查詢截至某個指定日期和時間的資料，歷程資料會統一顯示成一個快照。Athena 中的版本歷程查詢可在 Simple Storage Service (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         
```

*版本*參數是與 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` and `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)
```