

# Athena で圧縮を使用する
<a name="compression-formats"></a>

Athena は、複数の圧縮形式を使用するテーブルからの読み込みなど、データの読み書きのためのさまざまな圧縮形式をサポートしています。例えば、一部の Parquet ファイルが Snappy で圧縮されており、他の Parquet ファイルは GZIP で圧縮されているといった、Parquet ファイル形式を使用するテーブル内のデータも、Athena は正常に読み込むことができます。同様なことが 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 Block Format Description](https://github.com/lz4/lz4/blob/dev/doc/lz4_Block_format.md)」(LZ4 ブロック形式の説明) を参照してください。
  + **LZ4 Framed** – LZ4 の一般的なフレーミング実装。詳細については、GitHub の「[LZ4 Frame Format Description](https://github.com/lz4/lz4/blob/dev/doc/lz4_Frame_format.md)」(LZ4 フレームフォーマットの説明) を参照してください。
  + **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 には以下の 2 つの実装があります。
  + **Standard LZO** – 詳細については、Oberhumer ウェブサイトで LZO の「[abstract](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** – ORC データストレージ形式のファイルで、書き込み圧縮にデフォルトで使用する、DEFLATE をベースにした圧縮形式 詳細については、GitHub の「[zlib](https://github.com/madler/zlib)」ページを参照してください。
+  **ZSTD** – [Zstandard real-time data compression algorithm](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 文は、非圧縮ファイルの書き込みをサポートします。非圧縮ファイルを書き込むには、次の構文を使用します。
+ CREATE TABLE (テキストファイルまたは JSON) – `TBLPROPERTIES` で、`write.compression = NONE` を指定します。
+ CREATE TABLE (Parquet) – `TBLPROPERTIES` で、`parquet.compression = UNCOMPRESSED` を指定します。
+ CREATE TABLE (ORC) – `TBLPROPERTIES` で、`orc.compress = NONE` を指定します。

## 注意事項とリソース
<a name="compression-support-notes-and-resources"></a>
+ 現在、大文字のファイル拡張子 (`.GZ` または `.BZIP2` など) は、Athena では認識されません。大文字のファイル拡張子を持つデータセットを使用しないようにするか、データファイルの拡張子を小文字に変更します。
+ CSV、TSV、および JSON のデータについては、Athena がファイル拡張子から圧縮タイプを判断します。ファイル拡張子がない場合、Athena はデータを非圧縮のプレーンテキストとして扱います。データが圧縮されている場合は、ファイル名に圧縮の拡張子 (`gz` など) が含まれていることを確認します。
+ ZIP ファイル形式はサポートされていません。
+ Athena からの Amazon Data Firehose ログのクエリでサポートされる形式には、GZIP 圧縮、または SNAPPY 圧縮を使用する ORC ファイルが含まれます。
+ 圧縮の使用の詳細については、「AWS Big·Data·ブログ」の記事「[Amazon Athena のパフォーマンスチューニング Tips トップ 10](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)」のセクション 3「ファイルを圧縮・分割する」 を参照してください。

**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 | あり | はい | はい | はい | はい | 
| なし | はい | はい | はい | はい | はい | 

# 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 または 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 から 22 までの圧縮レベルをサポートします。Athena はデフォルトで ZSTD 圧縮レベル 3 を使用しています。

圧縮レベルは、圧縮速度や達成された圧縮量の間の細かいトレードオフを提供します。圧縮レベルが低くなるほど速度は速くなりますが、ファイルサイズは大きくなります。たとえば、速度が最も重要である場合にはレベル 1 を使用し、サイズが最も重要な場合はレベル 22 を使用できます。レベル 3 は多数のユースケースに適しており、デフォルトです。19 以上のレベルは、より多くのメモリを必要とするため、注意してご使用ください。また、ZSTD ライブラリには、圧縮速度と圧縮率の範囲を広げる負の圧縮レベルも用意されています。詳細については、「[Zstandard Compression RFC](https://datatracker.ietf.org/doc/html/rfc8478)」(Zstandard 圧縮 RFC) を参照してください。

豊富な圧縮レベルにより、大幅に微調整できる機会が増えます。ただし、圧縮レベルを決定する際には、必ずデータを測定し、そのトレードオフを考慮してください。圧縮速度と圧縮データ サイズの間の合理的なトレードオフのためには、デフォルトレベルである 3 または 6～9 の範囲のレベルを使用することをお勧めします。サイズが最も重要で、圧縮速度が問題にならない場合は、レベル 20 以上を確保します。

## 考慮事項と制限事項
<a name="compression-support-zstd-levels-considerations-and-limitations"></a>

Athena で ZSTD 圧縮レベルを使用する際は、以下の点を考慮してください。
+ ZTSD `compression_level` プロパティは、Athena エンジンバージョン 3 でのみサポートされます。
+ ZSTD `compression_level` プロパティは、`ALTER TABLE`、`CREATE TABLE`、`CREATE TABLE AS` (CTAS)、および `UNLOAD` ステートメントでサポートされています。
+ `compression_level` プロパティはオプションです。
+ `compression_level` プロパティは ZSTD 圧縮でのみサポートされます。
+ 可能な圧縮レベルは 1～22 です。
+ デフォルトの圧縮レベルは 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>

次の例では、テーブル `existing_table` を変更して、ZSTD 圧縮および ZSTD 圧縮レベル 4 の Parquet ファイル形式を使用します。`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 の例では、圧縮レベル 4 の ZSTD 圧縮を使用して、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)
```