

# Athena에서 압축 사용
<a name="compression-formats"></a>

Athena는 여러 압축 형식을 사용하는 테이블에서 데이터를 읽는 것을 비롯하여, 데이터 읽기 및 쓰기를 위한 다양한 압축 형식을 지원합니다. 예를 들어 Athena는 일부 Parquet 파일이 Snappy로 압축되고 다른 Parquet 파일이 GZIP으로 압축된 경우 Parquet 파일 형식을 사용하는 테이블의 데이터를 성공적으로 읽을 수 있습니다. ORC, 텍스트 파일, JSON 스토리지 형식에도 동일한 원칙이 적용됩니다.

## 지원되는 압축 형식
<a name="compression-support-formats"></a>

Athena는 다음 압축 형식을 지원합니다.
+ **BZIP2** – Burrows-Wheeler 알고리즘을 사용하는 형식입니다.
+ **DEFLATE** - [LZSS](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Storer%E2%80%93Szymanski) 및 [Huffman 코딩](https://en.wikipedia.org/wiki/Huffman_coding)을 기반으로 한 압축 알고리즘입니다. [Deflate](https://en.wikipedia.org/wiki/Deflate)는 Avro 파일 형식에만 해당됩니다.
+ **GZIP** - Deflate를 기반으로 한 압축 알고리즘입니다. Athena 엔진 버전 2 및 3의 Hive 테이블과 Athena 엔진 버전 2의 Iceberg 테이블의 경우 GZIP은 Parquet 및 텍스트 파일 스토리지 형식의 파일에 대한 기본 쓰기 압축 형식입니다. `tar.gz` 형식의 파일은 지원되지 않습니다.
+ **LZ4** - Lempel-Ziv 77(LZ7) 패밀리의 이 멤버도 최대 데이터 압축이 아닌 압축 및 압축 해제 속도에 중점을 둡니다. LZ4에는 다음과 같은 프레이밍 형식이 있습니다.
  + **LZ4 Raw/Unframed** – LZ4 블록 압축 형식의 프레이밍되지 않은 표준 구현입니다. 자세한 내용은 GitHub에서 [LZ4 블록 형식 설명](https://github.com/lz4/lz4/blob/dev/doc/lz4_Block_format.md)을 참조하세요.
  + **LZ4 framed** - LZ4의 일반적인 프레이밍 구현입니다. 자세한 내용은 GitHub에서 [LZ4 프레임 형식 설명](https://github.com/lz4/lz4/blob/dev/doc/lz4_Frame_format.md)을 참조하세요.
  + **LZ4 hadoop-compatible** - LZ4의 Apache Hadoop 구현입니다. 이 구현은 LZ4 압축을 [BlockCompressorStream.java](https://github.com/apache/hadoop/blob/f67237cbe7bc48a1b9088e990800b37529f1db2a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockCompressorStream.java) 클래스로 래핑합니다.
+ **LZO** - 최대 데이터 압축이 아닌 높은 압축 및 압축 해제 속도에 중점을 둔 Lempel–Ziv–Oberhumer 알고리즘을 사용하는 형식입니다. LZO에는 두 가지 구현이 있습니다.
  + **Standard LZO** - 자세한 내용은 Oberhumer 웹 사이트에서 LZO [요약](http://www.oberhumer.com/opensource/lzo/#abstract)을 참조하세요.
  + **LZO hadoop-compatible** - 이 구현은 LZO 알고리즘을 [BlockCompressorStream.java](https://github.com/apache/hadoop/blob/f67237cbe7bc48a1b9088e990800b37529f1db2a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockCompressorStream.java) 클래스로 래핑합니다.
+ **SNAPPY** – Lempel-Ziv 77 (LZ7) 패밀리의 일부인 압축 알고리즘입니다. Snappy는 데이터를 최대한 압축하는 것이 아니라, 높은 압축 및 압축 해제 속도에 중점을 둡니다.
+ **ZLIB** - Deflate를 기반으로 한 ZLIB는 ORC 데이터 스토리지 형식의 파일에 대한 기본 쓰기 압축 형식입니다. 자세한 내용은 GitHub에서 [zlib](https://github.com/madler/zlib) 페이지를 참조하세요.
+  **ZSTD** - [Zstandard 실시간 데이터 압축 알고리즘](http://facebook.github.io/zstd/)은 높은 압축비를 제공하는 빠른 압축 알고리즘입니다. Zstandard(ZSTD) 라이브러리는 BSD 라이선스를 사용하는 오픈 소스 소프트웨어로 제공됩니다. ZSTD는 Iceberg 테이블의 기본 압축입니다. ZSTD 압축 데이터를 작성할 때 Athena는 기본적으로 ZSTD 압축 수준 3을 사용합니다. Athena의 ZSTD 압축 수준 사용에 대한 자세한 내용은 [ZSTD 압축 수준 사용](compression-support-zstd-levels.md) 섹션을 참조하세요.

**참고**  
Athena는 LZ4 또는 LZO 형식으로 압축된 Parquet 파일 쓰기를 지원하지 않습니다. 이러한 압축 형식에 대한 읽기는 계속 지원됩니다.

## 압축 형식 지정
<a name="compression-support-specifying-compression-formats"></a>

CREATE TABLE 또는 CTAS 문을 작성할 때, Athena가 해당 테이블에 쓸 경우 사용할 압축 유형을 지정하는 압축 속성을 지정할 수 있습니다.
+ CTAS의 경우 [CTAS 테이블 속성](create-table-as.md#ctas-table-properties) 섹션을 참조하세요. 예시는 [CTAS 쿼리 예제](ctas-examples.md) 섹션을 참조하세요.
+ CREATE TABLE의 경우 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)에서 압축 테이블 속성 목록을 참조하세요.

## 압축 안 함 지정
<a name="compression-support-specifying-no-compression"></a>

CREATE TABLE 문은 압축되지 않은 파일을 지원합니다. 압축되지 않은 파일을 작성하려면 다음 구문을 사용합니다.
+ 테이블 만들기(텍스트 파일 또는 JSON) —`TBLPROPERTIES`를 지정합니다.`write.compression = NONE`.
+ 테이블 만들기(Parquet) —`parquet.compression = UNCOMPRESSED`에서 `TBLPROPERTIES`를 지정합니다.
+ 테이블 생성 (ORC) — `orc.compress = NONE`에서 `TBLPROPERTIES`를 지정합니다.

## 참고 및 리소스
<a name="compression-support-notes-and-resources"></a>
+ 현재 `.GZ` 또는 `.BZIP2`와 같은 대문자 파일 확장명은 Athena에서 인식되지 않습니다. 파일 확장명이 대문자인 데이터 세트을 사용하지 않거나 데이터 파일 확장명의 이름을 소문자로 바꿉니다.
+ CSV, TSV 및 JSON 형식 데이터의 경우 Athena는 파일 확장명에서 압축 형식을 결정합니다. 파일 확장자가 없는 경우 Athena는 데이터를 압축되지 않은 일반 텍스트로 처리합니다. 데이터가 압축된 경우 파일 이름에 `gz`와 같은 압축 확장명이 포함되어 있는지 확인하세요.
+ ZIP 파일 형식은 지원되지 않습니다.
+ Athena에서 querying Amazon Data Firehose 로그를 쿼리하는 경우, 지원되는 형식에는 GZIP 압축 또는 SNAPPY 압축을 사용하는 ORC 파일이 포함됩니다.
+ 압축 사용에 대한 자세한 내용은 AWS 빅 데이터 블로그 게시물 [Top 10 performance tuning tips for Amazon Athena](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)(Amazon Athena의 성능 튜닝을 위한 10가지 팁)의 섹션 3(“Compress and split files(파일 압축 및 분할)”)을 참조하세요.

**Topics**
+ [압축 형식 지정](#compression-support-specifying-compression-formats)
+ [압축 안 함 지정](#compression-support-specifying-no-compression)
+ [참고 및 리소스](#compression-support-notes-and-resources)
+ [Hive 테이블 압축](compression-support-hive.md)
+ [Iceberg 테이블 최적화](compression-support-iceberg.md)
+ [ZSTD 압축 수준](compression-support-zstd-levels.md)

# Hive 테이블 압축 사용
<a name="compression-support-hive"></a>

Athena의 Hive 테이블 압축 옵션은 엔진 버전과 파일 형식에 따라 다릅니다.

## Athena 엔진 버전 3의 Hive 압축 지원
<a name="compression-support-hive-v3"></a>

다음 표에는 Apache Hive의 스토리지 파일 형식에 대한 Athena 엔진 버전 3의 압축 형식 지원이 요약되어 있습니다. 텍스트 파일 형식에는 TSV, CSV, JSON 및 텍스트용 사용자 정의 SerDes가 포함됩니다. 셀의 “예” 또는 “아니요”는 별도로 명시된 경우를 제외하고 읽기 작업과 쓰기 작업에 동일하게 적용됩니다. 이 테이블에서는 CREATE TABLE, CTAS 및 INSERT INTO를 쓰기 작업으로 간주합니다. Athena의 ZSTD 압축 수준 사용에 대한 자세한 내용은 [ZSTD 압축 수준 사용](compression-support-zstd-levels.md) 섹션을 참조하세요.


****  

|  | Avro | Ion | ORC | PARQUET | 텍스트 파일 | 
| --- | --- | --- | --- | --- | --- | 
| bzip2 | 예 | 예 | 아니요 | 아니요 | 예 | 
| DEFLATE | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 
| GZIP | 아니요 | 예 | 아니요 | 예 | 예 | 
| LZ4 | 아니요 | 예 | 예 |  쓰기 - 아니요 읽기 - 예  | 예 | 
| LZO | 아니요 |  쓰기 - 아니요 읽기 - 예  | 아니요 |  쓰기 - 아니요 읽기 - 예  |  쓰기 - 아니요 읽기 - 예  | 
| Snappy | 예 | 예 | 예 | 예 | 예 | 
| ZLIB | 아니요 | 아니요 | 예 | 아니요 | 아니요 | 
| ZSTD | 예 | 예 | 예 | 예 | 예 | 
| NONE | 예 | 예 | 예 | 예 | 예 | 

# Iceberg 테이블 압축 사용
<a name="compression-support-iceberg"></a>

Athena의 Iceberg 테이블 압축 옵션은 엔진 버전과 파일 형식에 따라 다릅니다.

## Athena 엔진 버전 3의 Iceberg 압축 지원
<a name="compression-support-iceberg-v3"></a>

다음 표에는 Apache Iceberg의 스토리지 파일 형식에 대한 Athena 엔진 버전 3의 압축 형식 지원이 요약되어 있습니다. 셀의 “예” 또는 “아니요”는 별도로 명시된 경우를 제외하고 읽기 작업과 쓰기 작업에 동일하게 적용됩니다. 이 테이블에서는 CREATE TABLE, CTAS 및 INSERT INTO를 쓰기 작업으로 간주합니다. Athena 엔진 버전 3에서 Iceberg에 대한 기본 스토리지 형식은 Parquet입니다. Athena 엔진 버전 3에서 Iceberg에 대한 기본 압축 형식은 ZSTD입니다. Athena의 ZSTD 압축 수준 사용에 대한 자세한 내용은 [ZSTD 압축 수준 사용](compression-support-zstd-levels.md) 섹션을 참조하세요.


****  

|  | Avro | ORC | Parquet(기본값) | 
| --- | --- | --- | --- | 
| bzip2 | 아니요 | 아니요 | 아니요 | 
| GZIP | 예 | 아니요 | 예 | 
| LZ4 | 아니요 | 예 | 아니요 | 
| Snappy | 예 | 예 | 예 | 
| ZLIB | 아니요 | 예 | 아니요 | 
| ZSTD | 예 | 예 | 예(기본값) | 
| NONE | 예(None 또는 Deflate 지정) | 예 | 예(None 또는 Uncompressed 지정) | 

# ZSTD 압축 수준 사용
<a name="compression-support-zstd-levels"></a>

[Zstandard 실시간 데이터 압축 알고리즘](http://facebook.github.io/zstd/)은 높은 압축비를 제공하는 빠른 압축 알고리즘입니다. Zstandard(ZSTD) 라이브러리는 오픈 소스 소프트웨어이며 BSD 라이선스를 사용합니다. Athena는 ZSTD 압축 ORC, Parquet 및 텍스트 파일 데이터 읽기 및 쓰기를 지원합니다.

ZSTD 압축 수준을 사용하여 요구 사항에 따라 압축률과 속도를 조정할 수 있습니다. ZSTD 라이브러리는 1\$122의 압축 수준을 지원합니다. Athena는 기본적으로 ZSTD 압축 수준 3을 사용합니다.

압축 수준은 압축 속도와 달성된 압축량 간의 세분화된 균형을 제공합니다. 압축 수준이 낮을수록 속도는 빨라지지만 파일 크기는 커집니다. 예를 들어 속도가 가장 중요한 경우 수준 1을 사용하고 크기가 가장 중요한 경우 수준 22를 사용할 수 있습니다. 수준 3이 많은 사용 사례에 적합하며 기본값입니다. 수준 20부터는 더 많은 메모리가 필요하므로 주의하여 사용하세요. ZSTD 라이브러리는 또한 압축 속도와 비율의 범위를 확장하는 네거티브 압축 수준을 제공합니다. 자세한 내용은 [Zstandard Compression RFC](https://datatracker.ietf.org/doc/html/rfc8478)(Zstandard 압축 RFC)를 참조하세요.

많은 압축 수준은 미세 조정을 위한 상당한 기회를 제공합니다. 그러나 압축 수준을 결정할 때 데이터를 측정하고 장단점을 고려해야 합니다. 압축 속도와 압축된 데이터 크기 간의 적절한 균형을 위해 기본 수준 3 또는 수준 6\$19를 사용하는 것이 좋습니다. 크기가 가장 중요하고 압축 속도가 중요하지 않은 경우에는 수준 20 이상을 예약하세요.

## 고려 사항 및 제한 사항
<a name="compression-support-zstd-levels-considerations-and-limitations"></a>

Athena에서 ZSTD 압축 수준을 사용할 때 다음 사항을 고려하세요.
+ ZSTD `compression_level` 속성은 Athena 엔진 버전 3에서만 지원됩니다.
+ ZSTD `compression_level` 속성은 `ALTER TABLE`, `CREATE TABLE`, `CREATE TABLE AS`(CTAS) 및 `UNLOAD` 문에 지원됩니다.
+ `compression_level` 속성은 선택 사항입니다.
+ `compression_level` 속성은 ZSTD 압축에만 지원됩니다.
+ 가능한 압축 수준은 1\$122입니다.
+ 기본 압축 수준은 3입니다.

Athena에서 Apache Hive ZSTD 압축 지원에 대한 자세한 내용은 [Hive 테이블 압축 사용](compression-support-hive.md) 섹션을 참조하세요. Athena에서 Apache Iceberg ZSTD 압축 지원에 대한 자세한 내용은 [Iceberg 테이블 압축 사용](compression-support-iceberg.md) 섹션을 참조하세요.

## ZSTD 압축 수준 지정
<a name="compression-support-zstd-levels-specifying"></a>

`ALTER TABLE`, `CREATE TABLE`, `CREATE TABLE AS` 및 `UNLOAD` 문에 ZSTD 압축 수준을 지정하려면 `compression_level` 속성을 사용합니다. ZSTD 압축 자체를 지정하려면 문의 구문에서 사용하는 개별 압축 속성을 사용해야 합니다.

### ALTER TABLE SET TBLPROPERTIES
<a name="compression-support-zstd-levels-alter-table"></a>

[ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 문 `SET TBLPROPERTIES` 절에서 `'write.compression' = ' ZSTD'` 또는 `'parquet.compression' = 'ZSTD'`를 사용하여 ZSTD 압축을 지정합니다. 그런 다음 `compression_level` 속성을 사용하여 1에서 22 사이의 값을 지정합니다(예: '`compression_level' = '5'`). 압축 수준 속성을 지정하지 않으면 압축 수준은 기본적으로 3으로 설정됩니다.

#### 예제
<a name="compression-support-zstd-levels-alter-table-example"></a>

다음 예제에서는 ZSTD 압축 및 ZSTD 압축 수준 4와 함께 Parquet 파일 형식을 사용하도록 테이블 `existing_table`을 수정합니다. `TBLPROPERTIES`에서 압축 수준 값은 정수가 아닌 문자열로 입력해야 합니다. 따라서 작은 따옴표 또는 큰 따옴표로 묶어야 합니다.

```
ALTER TABLE existing_table 
SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = '4')
```

### CREATE TABLE
<a name="compression-support-zstd-levels-create-table"></a>

[CREATE TABLE](create-table.md) 문 `TBLPROPERTIES` 절에서 '`write.compression' = 'ZSTD'` 또는 `'parquet.compression' = 'ZSTD'`를 지정한 다음 `compression_level = compression_level`을 사용하고 1에서 22 사이의 값을 문자열로 지정합니다. `compression_level` 속성이 지정되지 않은 경우 기본 압축 수준은 3입니다.

#### 예제
<a name="compression-support-zstd-levels-create-table-example"></a>

다음 예제에서는 ZSTD 압축과 ZSTD 압축 수준 4를 사용하여 Parquet 파일 형식으로 테이블을 생성합니다.

```
CREATE EXTERNAL TABLE new_table ( 
  `col0` string COMMENT '', 
  `col1` string COMMENT '' 
) 
STORED AS PARQUET 
LOCATION 's3://amzn-s3-demo-bucket/' 
TBLPROPERTIES ('write.compression' = 'ZSTD', 'compression_level' = '4')
```

### CREATE TABLE AS (CTAS)
<a name="compression-support-zstd-levels-ctas"></a>

[CREATE TABLE AS](create-table-as.md) 문 `WITH` 절에서 `write_compression = 'ZSTD'` 또는 `parquet_compression = 'ZSTD'`를 지정한 다음 `compression_level = compression_level`을 사용하고 1에서 22 사이의 값을 문자열로 지정합니다. `compression_level` 속성이 지정되지 않은 경우 기본 압축 수준은 3입니다.

#### 예제
<a name="compression-support-zstd-levels-ctas-example"></a>

다음 CTAS 예제에서는 ZSTD 압축과 압축 수준 4를 사용하여 Parquet를 파일 형식으로 지정합니다. 단, `WITH` 절에서는 압축 수준 값을 문자열이 아닌 정수로 지정해야 합니다.

```
CREATE TABLE new_table  
WITH ( format = 'PARQUET', write_compression = 'ZSTD', compression_level = 4)  
AS SELECT * FROM old_table
```

### UNLOAD
<a name="compression-support-zstd-levels-unload"></a>

[UNLOAD](unload.md) 문 `WITH` 절에서 `compression = 'ZSTD'`를 지정한 다음 `compression_level = compression_level`을 사용하고 1에서 22 사이의 값을 문자열로 지정합니다. `compression_level` 속성이 지정되지 않은 경우 기본 압축 수준은 3입니다.

#### 예제
<a name="compression-support-zstd-levels-unload-example"></a>

다음 예제에서는 Parquet 파일 형식, ZSTD 압축 및 ZSTD 압축 수준 4를 사용하여 쿼리 결과를 지정된 위치로 언로드합니다.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
```