

# Linux Foundation Delta Lake 테이블 쿼리
<a name="delta-lake-tables"></a>

Linux Foundation [Delta Lake](https://delta.io/)는 빅 데이터 분석을 위한 테이블 형식입니다. Amazon Athena를 사용하면 매니페스트 파일을 생성하거나 `MSCK REPAIR` 문을 실행할 필요 없이 Amazon S3에 저장된 Delta Lake 테이블을 직접 읽을 수 있습니다.

Delta Lake 형식은 각 데이터 파일의 열당 최소값과 최대값을 저장합니다. Athena 구현에서는 이 정보를 사용하여 조건자에 대한 파일 건너뛰기를 활성화하여 원치 않는 파일이 고려되지 않도록 합니다.

## 고려 사항 및 제한 사항
<a name="delta-lake-tables-considerations-and-limitations"></a>

Athena의 Delta Lake 지원에는 다음과 같은 고려 사항 및 제한 사항이 있습니다.
+ **AWS Glue 카탈로그를 포함하는 테이블만** - 기본 Delta Lake 지원은 AWS Glue에 등록된 테이블을 통해서만 지원됩니다. 다른 메타스토어에 등록된 Delta Lake 테이블이 있는 경우 해당 테이블을 그대로 유지하고 기본 메타스토어로 처리할 수 있습니다. Delta Lake 메타데이터는 메타스토어가 아닌 파일 시스템(예: Amazon S3)에 저장되므로 Athena에서는 AWS Glue에 위치 속성만 있으면 Delta Lake 테이블에서 읽을 수 있습니다.
+ **V3 engine only**(V3 엔진 전용) - Delta Lake 쿼리는 Athena 엔진 버전 3에서만 지원됩니다. 생성된 작업 그룹이 Athena 엔진 버전 3을 사용하도록 구성되어 있는지 확인해야 합니다.
+ **No time travel support**(시간 이동 지원 안 함) - Delta Lake의 시간 이동 기능을 사용하는 쿼리는 지원되지 않습니다.
+ **Read only**(읽기 전용) - DML 문(예: `UPDATE`, `INSERT` 또는 `DELETE`)을 쓸 수 없습니다.
+ **Lake Formation 지원** - Lake Formation 통합은 AWS Glue와 스키마가 동기화된 Delta Lake 테이블에 사용할 수 있습니다. 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [Using AWS Lake Formation with Amazon Athena](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html) 및 [Set up permissions for a Delta Lake table](https://docs.aws.amazon.com/lake-formation/latest/dg/set-up-delta-table.html)을 참조하세요.
+ **Limited DDL support**(제한된 DDL 지원) - `CREATE EXTERNAL TABLE`, `SHOW COLUMNS`, `SHOW TBLPROPERTIES`, `SHOW PARTITIONS`, `SHOW CREATE TABLE`, `DESCRIBE` DDL 문이 지원됩니다. `CREATE EXTERNAL TABLE` 문 사용에 대한 자세한 내용은 [Delta Lake 테이블 시작하기](delta-lake-tables-getting-started.md) 단원을 참조하세요.
+ **Amazon Glacier 객체 건너뛰기 미지원** – Linux Foundation Delta Lake 테이블의 객체가 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는 기본적으로 CSE-KMS로 암호화된 Delta Lake 테이블 읽기를 지원하지 않습니다. SELECT 문과 DDL 문이 여기에 포함됩니다.

### Delta Lake 버전 관리 및 Athena
<a name="delta-lake-tables-versioning"></a>

Athena는 Delta Lake 설명서에 나열된 [버전 관리](https://docs.delta.io/latest/releases.html)를 사용하지 않습니다. Delta Lake 테이블이 Athena와 호환되는지 확인하려면 다음 두 가지 특성을 고려하세요.
+ **리더 버전** - 모든 Delta Lake 테이블에는 리더 버전이 있습니다. 현재 이 값은 1\$13 사이입니다. Athena가 지원하지 않는 리더 버전이 포함된 테이블을 포함하는 쿼리는 실패합니다.
+ **테이블 기능** - 모든 Delta Lake 테이블은 리더/라이터 기능 세트를 선언할 수도 있습니다. Athena의 Delta Lake 지원은 읽기 전용이므로 테이블 라이터 기능 호환성은 적용되지 않습니다. 하지만 테이블 리더 기능이 지원되지 않는 테이블에 대한 쿼리는 실패합니다.

다음 표는 Athena가 지원하는 Delta Lake 리더 버전과 Delta Lake 테이블 리더 기능을 보여줍니다.


****  

| 쿼리 유형 | 지원되는 리더 버전 | 지원되는 리더 기능 | 
| --- | --- | --- | 
| DQL(SELECT 문) | <= 3 | [열 매핑](https://docs.delta.io/latest/delta-column-mapping.html), [timestampNtz](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#timestamp-without-timezone-timestampntz), [삭제 벡터](https://docs.delta.io/latest/delta-deletion-vectors.html) | 
| DDL | <= 1 | 해당 사항 없음. 리더 기능은 리더 버전이 2 이상인 테이블에서만 선언할 수 있습니다. | 
+ Delta Lake 테이블 기능 목록은 GitHub.com의 [Valid feature names in table features](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#valid-feature-names-in-table-features)(테이블 기능의 유효한 기능 이름)을 참조하세요.
+ 프로토콜 버전별 Delta Lake 기능 목록은 GitHub.com의 [Features by protocol version](https://docs.delta.io/latest/versioning.html#features-by-protocol-version)(프로토콜 버전별 기능)을 참조하세요.

Athena에서 리더 버전이 1보다 큰 Delta Lake 테이블을 생성하려면 [Delta Lake 메타데이터 동기화](delta-lake-tables-syncing-metadata.md) 섹션을 참조하세요.

**Topics**
+ [고려 사항 및 제한 사항](#delta-lake-tables-considerations-and-limitations)
+ [지원되는 열 데이터 형식](delta-lake-tables-supported-data-types-columns.md)
+ [Delta Lake 테이블 시작하기](delta-lake-tables-getting-started.md)
+ [SQL을 사용하여 Delta Lake 테이블 쿼리](delta-lake-tables-querying.md)
+ [Delta Lake 메타데이터 동기화](delta-lake-tables-syncing-metadata.md)
+ [추가 리소스](delta-lake-tables-additional-resources.md)

# 지원되는 열 데이터 형식
<a name="delta-lake-tables-supported-data-types-columns"></a>

이 섹션에서는 비 파티션 및 파티션 열에 지원되는 데이터 형식에 대해 설명합니다.

## 지원되는 비분할 열 데이터 형식
<a name="delta-lake-tables-supported-data-types-non-partition-columns"></a>

비분할 열의 경우 `CHAR`를 제외하고 Athena에서 지원하는 모든 데이터 형식이 지원됩니다(`CHAR`는 Delta Lake 프로토콜 자체에서 지원되지 않음). 지원되는 데이터 형식은 다음과 같습니다.

```
boolean
tinyint
smallint
integer
bigint
double
float
decimal
varchar
string
binary
date
timestamp
array
map
struct
```

## 지원되는 파티션 열 데이터 형식
<a name="delta-lake-tables-supported-data-types-partition-columns"></a>

파티션 열의 경우 Athena에서는 다음과 같은 데이터 형식을 포함하는 테이블을 지원합니다.

```
boolean
integer
smallint
tinyint
bigint
decimal
float
double
date
timestamp
varchar
```

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

# Delta Lake 테이블 시작하기
<a name="delta-lake-tables-getting-started"></a>

쿼리가 가능하려면 Delta Lake 테이블이 AWS Glue에 있어야 합니다. 테이블이 Amazon S3에 있지만 AWS Glue에 없는 경우 다음 구문을 사용하여 `CREATE EXTERNAL TABLE` 문을 실행합니다. 테이블이 이미 AWS Glue에 있는 경우(예: AWS Glue에서 Apache Spark 또는 다른 엔진을 사용 중인 경우) 이 단계를 건너뛰어도 됩니다. 열 정의, SerDe 라이브러리 및 기타 테이블 속성의 생략에 유의하세요. 기존 Hive 테이블과 달리 Delta Lake 테이블 메타데이터는 Delta Lake 트랜잭션 로그에서 추론되고 AWS Glue에 직접 동기화됩니다.

```
CREATE EXTERNAL TABLE
  [db_name.]table_name
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ('table_type' = 'DELTA')
```

**참고**  
이 문은 요청자 지불이 활성화된 S3 버킷과 호환되지 않습니다. 요청자 지불이 활성화된 S3 버킷에 대해 Delta Lake 테이블을 생성하려면 [Delta Lake 메타데이터 동기화](delta-lake-tables-syncing-metadata.md)의 지침과 DDL 문을 따르세요.
Delta Lake 테이블의 경우 `LOCATION` 및 `table_type` 속성보다 많은 항목이 포함된 `CREATE TABLE` 문은 허용되지 않습니다.

# SQL을 사용하여 Delta Lake 테이블 쿼리
<a name="delta-lake-tables-querying"></a>

Delta Lake 테이블을 쿼리하려면 표준 SQL `SELECT` 구문을 사용하세요.

```
[ WITH with_query [, ...] ]SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

`SELECT` 구문에 대한 자세한 내용은 Athena 설명서의 [SELECT](select.md) 단원을 참조하세요.

Delta Lake 형식은 각 데이터 파일의 열당 최소값과 최대값을 저장합니다. Athena에서는 이 정보를 사용하여 조건자에 대한 파일 건너뛰기를 활성화하여 불필요한 파일이 고려되지 않도록 합니다.

# Delta Lake 메타데이터 동기화
<a name="delta-lake-tables-syncing-metadata"></a>

Athena를 사용하여 Delta Lake 테이블을 생성하는 경우 Athena에서는 스키마, 파티션 열 및 테이블 속성을 비롯한 테이블 메타데이터를 AWS Glue에 동기화합니다. 시간이 경과함에 따라 이 메타데이터와 트랜잭션 로그 내 기본 테이블 메타데이터의 동기화가 손실될 수 있습니다. 테이블을 최신 상태로 유지하기 위해 다음 옵션 중 하나를 선택할 수 있습니다.
+ Delta Lake 테이블에 대해 AWS Glue 크롤러를 사용합니다. 자세한 내용은 *AWS Big Data Blog*의 [Introducing native Delta Lake table support with AWS Glue crawlers](https://aws.amazon.com/blogs/big-data/introducing-native-delta-lake-table-support-with-aws-glue-crawlers/) 및 AWS Glue 개발자 안내서의 [Scheduling an AWS Glue crawler](https://docs.aws.amazon.com/glue/latest/dg/schedule-crawler.html)를 참조하세요.
+ Athena에서 테이블을 삭제하고 다시 생성합니다.
+ SDK, CLI 또는 AWS Glue 콘솔을 사용하여 AWS Glue에서 스키마를 수동으로 업데이트합니다.

다음 기능을 사용하려면 AWS Glue 스키마가 항상 트랜잭션 로그와 동일한 스키마를 보유해야 합니다.
+ Lake Formation
+ 보기
+ 행 및 열 필터

워크플로에 이 기능이 필요하지 않고 이러한 호환성을 유지 관리하고 싶지 않은 경우 Athena에서 `CREATE TABLE` DDL을 사용한 후 AWS Glue에서 Amazon S3 경로를 SerDe 파라미터로 추가하면 됩니다.

## Athena 및 AWS Glue 콘솔을 사용하여 Delta Lake 테이블 생성
<a name="delta-lake-tables-syncing-metadata-console"></a>

다음 절차에 따라 Athena 및 AWS Glue 콘솔을 사용하여 Delta Lake 테이블을 생성할 수 있습니다.

**Athena 및 AWS Glue 콘솔을 사용하여 Delta Lake 테이블을 생성하려면**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)에서 Athena 콘솔을 엽니다.

1. Athena 쿼리 편집기에서 다음 DDL을 사용하여 Delta Lake 테이블을 생성합니다. 이 방법을 사용하는 경우 `TBLPROPERTIES`의 값이 `'table_type' = 'delta'`가 아닌 `'spark.sql.sources.provider' = 'delta'`여야 합니다.

   Apache Spark(Athena for Apache Spark) 또는 대부분의 다른 엔진을 사용하여 테이블을 생성하는 경우 이 동일한 스키마(열 이름이 `col`이고 유형이 `array<string>`인 단일 열)가 삽입됩니다.

   ```
   CREATE EXTERNAL TABLE
      [db_name.]table_name(col array<string>)
      LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
      TBLPROPERTIES ('spark.sql.sources.provider' = 'delta')
   ```

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창의 **데이터 카탈로그**에서 **테이블**을 선택합니다.

1. 테이블 목록에서 테이블에 대한 링크를 선택합니다.

1. 테이블 페이지에서 **작업**, **테이블 편집**을 선택합니다.

1. **Serde 파라미터** 섹션에서 값이 **s3://amzn-s3-demo-bucket/*your-folder*/**인 **path** 키를 추가합니다.

1. **저장**을 선택합니다.

## AWS CLI를 사용하여 Delta Lake 테이블 생성
<a name="delta-lake-tables-syncing-metadata-cli"></a>

AWS CLI를 사용하여 Delta Lake 테이블을 생성하려면 다음과 같은 명령을 입력합니다.

```
aws glue create-table --database-name dbname \
    --table-input '{"Name" : "tablename", "StorageDescriptor":{
            "Columns" : [
                {
                    "Name": "col",
                    "Type": "array<string>"
                }
            ],
            "Location" : "s3://amzn-s3-demo-bucket/<prefix>/",
            "SerdeInfo" : {
                "Parameters" : {
                    "serialization.format" : "1",
                    "path" : "s3://amzn-s3-demo-bucket/<prefix>/"
                }
            }
        },
        "PartitionKeys": [],
        "TableType": "EXTERNAL_TABLE",
        "Parameters": {
            "EXTERNAL": "TRUE",
            "spark.sql.sources.provider": "delta"
        }
    }'
```

# 추가 리소스
<a name="delta-lake-tables-additional-resources"></a>

AWS Glue에서 Delta Lake 테이블을 사용하고 Athena에서 해당 테이블을 쿼리하는 방법에 대한 설명은 *AWS 빅 데이터 블로그*의 [Handle UPSERT data operations using open-source Delta Lake and AWS Glue](https://aws.amazon.com/blogs/big-data/handle-upsert-data-operations-using-open-source-delta-lake-and-aws-glue/)를 참조하세요.