

# 시간 이동 및 버전 이동 쿼리 수행
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

각 Apache Iceberg 테이블은 포함하는 Amazon S3 객체의 버전이 지정된 매니페스트를 유지 관리합니다. 이전 버전의 매니페스트는 시간 이동 및 버전 이동 쿼리에 사용할 수 있습니다.

Athena 시간 이동 쿼리는 지정된 날짜 및 시간을 기준으로 일관된 스냅샷의 기록 데이터에 대해 Amazon S3를 쿼리합니다. Athena의 버전 이동 쿼리는 지정된 스냅샷 ID를 기준으로 기록 데이터에 대해 Amazon S3를 쿼리합니다.

## 시간 이동 쿼리
<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` 및 `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)
```