

# 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 카탈로그를 포함한 테이블만 해당** - Athena는 [오픈 소스 Glue 카탈로그 구현](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)에 정의된 사양을 기반으로 AWS Glue 카탈로그에 대해 생성된 Iceberg 테이블만 지원합니다.
+ **AWS Glue에 의한 테이블 잠금만 지원** - 플러그인 사용자 지정 잠금을 지원하는 오픈 소스 Glue 카탈로그 구현과 달리 Athena는 AWS Glue 낙관적 잠금만 지원합니다. Athena를 사용하여 다른 잠금 구현으로 Iceberg 테이블을 수정하면 잠재적 데이터 손실 및 트랜잭션 중단이 발생할 수 있습니다.
+ **지원되는 파일 형식** - Athena 엔진 버전 3은 Iceberg 파일 형식을 지원합니다.
  + PARQUET
  + ORC
  + Avro
+ **Iceberg 제한된 메타데이터** - Lake Formation은 Iceberg 메타데이터 테이블을 평가하지 않습니다. 따라서 기본 테이블에 Lake Formation 행 또는 셀 필터가 있거나 기본 테이블의 모든 열을 볼 권한이 없는 경우 Iceberg 메타데이터 테이블이 제한됩니다. 이 경우 `$partitions`, `$files` `$manifests`, `$snapshots` Iceberg 메타데이터 테이블을 쿼리하면 실패하고 `AccessDeniedException` 오류가 발생합니다. 또한 메타데이터 열 `$path`에는 동일한 Lake Formation 제한이 적용되며 쿼리에서 선택할 때 실패합니다. Lake Formation 필터에 관계없이 다른 모든 메타데이터 테이블을 쿼리할 수 있습니다. 자세한 내용은 [Metadata tables](https://trino.io/docs/current/connector/iceberg.html#metadata-tables)를 참조하세요.
+ **Iceberg v2 테이블** - Athena는 Iceberg v2 테이블에서만 생성하고 작동합니다. v1과 v2 테이블의 차이점은 Apache Iceberg 설명서의 [Format version changes](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)(포맷 버전 변경 사항)을 참조하세요.
+ **시간대가 없는 시간 유형 표시** - 시간대 유형이 없는 시간 및 타임스탬프는 UTC로 표시됩니다. 시간 열의 필터 표현식에 표준 시간대가 지정되지 않은 경우 UTC가 사용됩니다.
+ **타임스탬프 관련 데이터 정밀도** - Iceberg는 타임스탬프 데이터 형식에 대해 마이크로초 정밀도를 지원하지만, Athena는 읽기 및 쓰기 모두에서 타임스탬프에 대해 밀리초 정밀도만 지원합니다. Athena는 수동 압축 작업 중에 다시 작성된 시간 관련 열의 데이터에 대해 밀리초 정밀도만 유지합니다.
+ **지원되지 않는 작업** - 다음 Athena 작업은 Iceberg 테이블에서 지원되지 않습니다.
  + [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ **보기** - [뷰 작업](views.md)에 설명된 대로 `CREATE VIEW`를 사용하여 Athena 보기를 생성합니다. [Iceberg 보기 사양](https://github.com/apache/iceberg/blob/master/format/view-spec.md)을 사용하여 보기를 생성하려면 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)에 문의하세요.
+ **TTF 관리 명령이 AWS Lake Formation에서 지원되지 않음** - Lake Formation을 사용하여 Apache Iceberg, Apache Hudi 및 Linux Foundation Delta Lake와 같은 TransactionTable Formats(TTF)에 대한 읽기 액세스 권한을 관리할 수는 있지만, Lake Formation을 사용하여 이러한 테이블 형식에서 `VACUUM`, `MERGE`, `UPDATE` 또는 `OPTIMIZE`와 같은 작업에 대한 권한을 관리할 수는 없습니다. Athena와 Lake Formation의 통합에 대한 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [Using AWS Lake Formation with Amazon Athena](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*.
+ **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 설명서의 [Format version changes](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가 표시됩니다.

Athena에서 Iceberg 테이블을 생성하려면 다음 구문 요약과 같이 `TBLPROPERTIES` 절에서 `'table_type'` 테이블 속성을 `'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의 숨겨진 분할](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)(Iceberg's hidden partitioning)을 참조하세요.

### 테이블 속성 지정
<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 속성에 해당합니다. | 
| 허용되는 속성 값 | 양수. | 
| 기본값 | 432000초(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 테이블을 생성하는 방법에 대한 자세한 내용은 [CREATE TABLE AS](create-table-as.md)를 참조하세요. 특히 [CTAS 테이블 속성](create-table-as.md#ctas-table-properties) 섹션에 주의하세요.

## 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의 최신 메타데이터 파일 위치를 업데이트합니다. 자세한 내용은 [Data Catalog and crawlers in 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 [포맷 v2 사양](https://iceberg.apache.org/spec/#format-versioning)을 따르며 위치 및 동일 삭제 모두에 대해 병합 시 읽기 작업을 수행합니다.

```
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 테이블을 생성한 경우 Iceberg 테이블 열 정보가 AWS Glue Data Catalog에 채워지도록 [Apache Iceberg SDK](https://iceberg.apache.org/releases/) 버전 0.13.0 이상을 사용하세요. Iceberg 테이블에 AWS Glue의 열 정보가 포함되어 있지 않은 경우 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 테이블은 포함하는 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)
```

# Iceberg 테이블 데이터 업데이트
<a name="querying-iceberg-updating-iceberg-table-data"></a>

Iceberg 테이블 데이터는 `INSERT`, `UPDATE` 및 `DELETE` 쿼리를 사용하여 Athena에서 직접 관리할 수 있습니다. 각 데이터 관리 트랜잭션은 시간 이동을 사용하여 쿼리할 수 있는 새 스냅샷을 생성합니다. `UPDATE` 및 `DELETE` 문은 Iceberg 형식 v2 행 수준 [위치 삭제](https://iceberg.apache.org/spec/#position-delete-files) 사양 및 스냅샷 격리 적용을 따릅니다.

**참고**  
Athena SQL은 현재 copy-on-write 접근 방식을 지원하지 않습니다. `UPDATE`, `MERGE INTO`, `DELETE FROM` 작업은 지정된 테이블 속성에 관계없이 항상 위치 삭제와 함께 merge-on-read 접근 방식을 사용합니다. `write.update.mode`, `write.merge.mode` 및/또는 `write.delete.mode`와 같은 테이블 속성을 copy-on-write를 사용하도록 설정한 경우 Athena는 이를 무시하고 merge-on-read을 계속 사용하므로 쿼리가 실패하지 않습니다.

다음 명령을 사용하여 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`는 스캔 데이터의 양에 따라 외부 Hive 테이블에 대한 현재 `INSERT INTO` 쿼리와 동일한 요금이 부과됩니다. 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 위치 삭제 파일을 테이블에 씁니다. 이는 읽기 중 병합(merge-on-read) 삭제라고 알려져 있습니다. 쓸 때 복사(copy-on-write) 삭제와 달리 읽기 중 병합 삭제는 파일 데이터를 다시 쓰지 않기 때문에 더 효율적입니다. Athena가 Iceberg 데이터를 읽을 때 Iceberg 위치 삭제 파일을 데이터 파일과 병합하여 테이블의 최신 뷰를 생성합니다. 이러한 위치 삭제 파일을 제거하려면 [REWRITE DATA 압축 작업](querying-iceberg-data-optimization.md#querying-iceberg-data-optimization-rewrite-data-action)을 실행할 수 있습니다. `DELETE` 작업은 스캔 데이터의 양에 따라 요금이 부과됩니다. 구문은 [DELETE](delete-statement.md) 단원을 참조하세요.

다음 예에서는 `iceberg_table`에서 `category` 값이 `c3`인 행을 삭제합니다.

```
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 테이블의 테이블 메타데이터는 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`를 사용하여 Iceberg 테이블 속성인 `write.data.path`와 `write.object-storage.path`를 설정하거나 제거할 수 있습니다. 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 테이블을 삭제합니다.

**주의**  
Iceberg 테이블은 Athena에서 관리형 테이블로 간주되므로 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>

Athena에서 Iceberg 테이블을 다시 생성하는 데 사용할 수 있는 `CREATE TABLE` DDL 문을 표시합니다. 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 테이블의 하나 이상의 테이블 속성을 표시합니다. 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 형식은 다음과 같은 스키마 진화 변경을 지원합니다.
+ **추가** - 테이블 또는 중첩된 `struct`에 새 열을 추가합니다.
+ **삭제** - 테이블이나 중첩된 `struct`에서 기존 열을 제거합니다.
+ **이름 바꾸기** - 중첩된 `struct`에서 기존 열 또는 필드의 이름을 바꿉니다.
+ **재정렬** - 열의 순서를 변경합니다.
+  **형식 승격** - 열, `struct` 필드, `map` 키, `map` 값 또는 `list` 요소의 형식을 확장합니다. 현재 Iceberg 테이블에 대해 다음과 같은 경우를 지원합니다.
  + integer에서 big integer로
  + float에서 double로
  + decimal 형식의 정밀도 증가

이 섹션의 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 테이블에 하나 이상의 열을 추가합니다.

## 시놉시스
<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>

[DROP DATABASE](drop-database.md)를 `CASCADE` 옵션과 함께 사용하면 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 테이블은 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는 테이블 구조를 최적화하기 위해 수동 압축 및 vacuum 연산자를 지원합니다. 또한 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 테이블을 사용하면 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에서 읽어야 하는 데이터의 양을 줄입니다.

Athena는 기본 Parquet 파일에 열 인덱스가 있는 경우 기본적으로 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에 저장됩니다. 사전 계산된 결과는 Amazon S3에서 Apache Iceberg 테이블로 저장됩니다. 일반 Iceberg 테이블을 쿼리하는 것처럼 표준 SQL `SELECT` 문을 사용하여 Athena에서 이러한 구체화된 뷰를 쿼리할 수 있습니다.

## 사전 조건
<a name="querying-iceberg-gdc-mv-prerequisites"></a>

Athena에서 구체화된 뷰를 쿼리하기 전에 다음을 확인합니다.
+ 구체화된 뷰는 AWS Glue Data Catalog에 있으며 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 버킷에 저장된 구체화된 뷰의 경우 IAM 역할이 S3 Tables 카탈로그에 액세스하는 데 필요한 권한을 보유하는지 확인합니다.

## 고려 사항 및 제한 사항
<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 설명서의 [schemas page for Iceberg](https://iceberg.apache.org/docs/latest/schemas/)(Iceberg에 대한 스키마 페이지)를 참조하세요.

다음 표에서는 Athena 데이터 형식과 Iceberg 테이블 데이터 형식 간의 관계를 보여줍니다.


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

Athena 데이터 형식에 대한 자세한 내용은 [Amazon Athena의 데이터 형식](data-types.md) 섹션을 참조하세요.

# 추가 리소스
<a name="querying-iceberg-additional-resources"></a>

다음 문서는 AWS 규범 지침 문서에 있습니다.
+ [Amazon Athena SQL을 사용하여 Apache Iceberg 테이블 작업하기](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-athena.html) 

Apache Iceberg 테이블에서 Athena를 사용하는 방법에 대한 자세한 내용은 *AWS 빅 데이터 블로그*의 다음 게시물을 참조하세요.
+ [Amazon DynamoDB 및 Amazon Athena를 사용하여 Apache Iceberg로 서버리스 CDC 프로세스 구현](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/) 
+ [Build an Apache Iceberg data lake using Amazon Athena, Amazon EMR, and AWS Glue](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/) 