UNLOAD
SELECT
ステートメントからのクエリ結果を指定したデータ形式に書き込みます。UNLOAD
でサポートされる形式には Apache Parquet、ORC、Apache Avro、および JSON が含まれます。CSV は Athena SELECT
コマンドがサポートする唯一の出力形式ですが、さまざまな出力形式をサポートする UNLOAD
コマンドを使用して SELECT
クエリを囲み、クエリの出力を UNLOAD
がサポートする形式のいずれかに書き換えることができます。
CREATE TABLE AS
(CTAS) ステートメントを使用して CSV 以外の形式でデータを出力できますが、CTAS ステートメントでは Athena でテーブルを作成する必要があります。UNLOAD
ステートメントは、SELECT
クエリの結果を非 CSV 形式で出力したいが、関連付けられたテーブルを必要としない場合に便利です。たとえば、ダウンストリームアプリケーションでは、SELECT
クエリの結果を JSON 形式にする必要があります。また、SELECT
クエリの結果を追加の分析に使用する場合は、Parquet や ORC の方が CSV よりもパフォーマンス面での利点を得られる可能性があります。
考慮事項と制約事項
Athena で UNLOAD
ステートメント使用するときは、次の点に注意してください。
-
ファイルのグローバルな順序付けがありません -
UNLOAD
結果が複数のファイルに並行して書き込まれます。UNLOAD
ステートメントのSELECT
クエリでソート順序が指定されている場合、各ファイルの内容はソート順序になりますが、ファイル同士は互いにソートされません。 -
孤立したデータが削除されません - 障害が発生した場合、Athena は孤立したデータの削除を試みません。この動作は、CTAS および
INSERT INTO
ステートメントの動作と同じです。 -
最大パーティション数 -
UNLOAD
で使用できるパーティションの最大数は 100 です。 -
メタデータおよびマニフェストファイル - Athena が、
UNLOAD
クエリごとにメタデータファイルとデータマニフェストファイルを生成します。マニフェストは、クエリが書き込んだファイルを追跡します。両方のファイルが、Amazon S3 の Athena クエリ結果の場所に保存されます。詳細については、「クエリ出力ファイルを識別する」を参照してください。 -
暗号化 -
UNLOAD
出力ファイルが、Amazon S3 で使用される暗号化設定に従って暗号化されます。暗号化設定を設定してUNLOAD
結果を暗号化するには、EncryptionConfiguration API を使用します。 -
準備済みステートメント -
UNLOAD
は、準備済みステートメントで使用できます。Athena での準備済みステートメントの詳細については、「パラメータ化されたクエリを使用する」を参照してください。 -
サービスクォータ -
UNLOAD
は、DML クエリクォータを使用します。クオータの詳細については、「Service Quotas」を参照してください。 -
予想されるバケット所有者 — 予想されるバケット所有者の設定は、
UNLOAD
クエリで指定された送信先の Amazon S3 の場所には適用されません。予期されるバケット所有者の設定は、Athena クエリの結果の出力先として指定した Amazon S3 内の場所にのみ適用されます。詳細については、「Athena コンソールを使用してクエリ結果の場所を指定する」を参照してください。
構文
UNLOAD
ステートメントでは、次の構文を使用します。
UNLOAD (SELECT
col_name
[, ...] FROMold_table
) TO 's3://amzn-s3-demo-bucket/my_folder
/' WITH (property_name
= 'expression
' [, ...] )
パーティションに書き込む場合を除き、TO
書き込み先にはデータのない Amazon S3 ロケーションを指定する必要があります。UNLOAD
クエリが、指定された場所に書き込む前に、バケットの場所が空であることを確認します。UNLOAD
は、指定された場所にデータがすでに存在する場合、その場所にデータを書き込まないので、UNLOAD
が既存のデータを上書きすることはありません。バケットの場所を UNLOAD
の送信先として再利用するには、バケットの場所にあるデータを削除して、クエリを再度実行します。
UNLOAD
がパーティションにき込む場合、これとは異なる動作になることに注意してください。同じ SELECT
ステートメント、同じ TO
ロケーション、および同じパーティションを持つ同一の UNLOAD
クエリを複数回実行する場合、各 UNLOAD
クエリはそのロケーションにある Amazon S3 と指定されたパーティションにデータをアンロードします。
パラメータ
property_name
に使用できる値は次のとおりです。
- 形式 =「
file_format
」 -
必須。出力のファイル形式を指定します。
file_format
に使用できる値は、ORC
、PARQUET
、AVRO
、JSON
、 またはTEXTFILE
です。 - 圧縮 =「
compression_format
」 -
オプション。このオプションは、ORC および Parquet 形式に固有のものです。ORC の場合、デフォルトは
zlib
で、Parquet の場合、デフォルトはgzip
です。サポートされている圧縮形式については、「Athena 圧縮サポート」を参照してください。注記
このオプションは、
AVRO
形式には適用されません。Athena が、JSON
およびTEXTFILE
形式にgzip
を使用します。 - compression_level =
compression_level
-
オプション。ZSTD 圧縮に使用する圧縮レベル。このプロパティは、ZSTD 圧縮にのみ適用されます。詳細については、「ZSTD 圧縮レベルを使用する」を参照してください。
- field_delimiter =「
delimiter
」 -
オプション。CSV、TSV、およびその他のテキスト形式のファイルのための単一文字のフィールド区切り文字を指定します。次に示す例では、カンマ区切り文字を指定しています。
WITH (field_delimiter = ',')
現在、複数文字のフィールド区切り文字はサポートされていません。フィールド区切り文字を指定しない場合、8 進文字
\001
(^A) が使用されます。 - partitioned_by = ARRAY[
col_name
[,...]] -
オプション。出力をパーティション化する列の配列リスト。
注記
SELECT
ステートメントでは、パーティション化された列の名前は、列のリストの最後に記述されていることを確認してください。
例
次の例では、JSON 形式を使用して SELECT
クエリの出力を Amazon S3 の場所 s3://amzn-s3-demo-bucket/unload_test_1/
に書き込みます。
UNLOAD (SELECT * FROM old_table) TO 's3://amzn-s3-demo-bucket/unload_test_1/' WITH (format = 'JSON')
次の例では、Snappy 圧縮を使用して SELECT
クエリの出力を Parquet 形式で書き込みます。
UNLOAD (SELECT * FROM old_table) TO 's3://amzn-s3-demo-bucket/' WITH (format = 'PARQUET',compression = 'SNAPPY')
次の例では、出力が最後の列でパーティション化された状態で、4 つの列をテキスト形式で書き込みます。
UNLOAD (SELECT name1, address1, comment1, key1 FROM table1) TO 's3://amzn-s3-demo-bucket/ partitioned/' WITH (format = 'TEXTFILE', partitioned_by = ARRAY['key1'])
次の例では、Parquet ファイル形式、ZSTD 圧縮、および ZSTD 圧縮レベル 4 を使用して、クエリ結果を指定された場所にアンロードします。
UNLOAD (SELECT * FROM old_table) TO 's3://amzn-s3-demo-bucket/' WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
追加リソース
-
AWS Big Data Blog の「Simplify your ETL and ML pipelines using the Amazon Athena UNLOAD feature
」。