Amazon Redshift の UNLOAD コマンドについてまとめました。
UNLOADコマンド
Redshift では UNLOAD コマンドを使用してクエリの結果を S3 にアンロードすることができます。 基本的なコマンドの構文は以下の通りです。ここからロードするデータに合わせてオプションのパラメータを付加します。
UNLOAD ('select_statement') TO 's3://bucket/object_path_prefix' [ WITH ] CREDENTIALS [AS] 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>'; [ option [ ... ] ];
select_statement
には SELECT クエリを指定します。特定のテーブルを全件 UNLOAD したい場合はSELECT * FROM table_name
とするだけです。ORDER BY
句を指定することでソートされた順番で UNLOAD することが可能です。
また、クエリは一重引用符(シングルクォーテーション)で囲む必要があるため、クエリに一重引用符がある場合はバックスラッシュ\
でエスケープする必要があります。
s3://bucket/object_path_prefix
は
デフォルトでは、UNLOAD はスライスごとに 1 つ以上のファイルに書き込まれるので、ファイル名は次の形式になります。s3://bucket/object_path_prefix<slice-number>_part_<file-number>
例えばTO 's3://bucket/work/users_'
とした場合の実行結果です。
$ aws s3 ls s3://bucket/work/ 2015-12-13 16:24:12 74 users_0000_part_00 2015-12-13 16:24:12 62 users_0001_part_00
オプション一覧
UNLOAD コマンドに付加できるオプションは以下の通りです。
オプション | 機能 |
---|---|
MANIFEST | アンロードファイルのURLが書かれたマニフェストファイルがJSON 形式で作成されます。COPY コマンドでロードする時に便利です。 |
DELIMITER AS 'delimiter_character' | パイプ文字| カンマ, タブ\t など区切り文字を指定します。デフォルトはパイプ文字です。 |
FIXEDWIDTH 'fixedwidth_spec' | 区切り文字ではなく各列の幅が固定長のファイルにデータをアンロードします。fixedwidth_spec には'colID1:colWidth1,colID2:colWidth2, ...'のようにカラムと長さを指定します。DELIMITER と併用はできません。 |
ENCRYPTED | アンロードするファイルの暗号化オプションです。 |
GZIP | ファイルが gzip 圧縮されて.gz 拡張子が最後に付加されます。 |
ADDQUOTES | 各カラムが引用符(ダブルクォーテーション)で囲まれます。区切り文字がデータに含まれている場合に有効です。 |
NULL AS 'null_string' | NULL の変わりに出力する文字列を指定します。デフォルトでは長さゼロの空文字列が出力されます。 |
ESCAPE | データに区切り文字や引用符が存在する場合、エスケープ文字\ が付加されます。 |
ALLOWOVERWRITE | UNLOAD によってファイルが存在する場合は上書きされます。デフォルトは上書きされずに失敗します。 |
PARALLEL [ ON | OFF ] | デフォルトでは PARALLEL オプションが ON になっていて、クラスター内のスライスの数に応じて、データを複数のファイルに同時に書き込みます。OFF の場合は 1 つ以上のファイルに逐次的に書き込まれます。ファイルの最大サイズは 6.2 GBです。 |
注意事項
区切り文字がデータに含まれている場合、ESCAPE または ADDQUOTES オプションを使用してください。
例えば1,Yamada,Hello, World
というデータをアンロードしようとすると Hello と World は異なるフィールドとして認識されてしまいますが、各オプションを付けた場合は以下のようにアンロードされます。
1,Yamada,Hello\, World # ESCAPE "1","Yamada","Hello, World" # ADDQUOTES
また、ADDQUOTES オプションを付けた時に、データに引用符が含まれている可能性もある場合は、ADDQUOTES + ESCAPE の両方を指定すると、引用符も エスケープしてくれます。
"1","Yamada","Hello\, \"World\"" # ADDQUOTES + ESCAPE
ただし、ADDQUOTES + ESCAPE をしてしまうと、COPY コマンドでロードできなくなってしまいます。COPY コマンドでこの形式をロードしようとすると、CSV オプションを付けることになりますが、この場合、引用符で囲まれていると自動的にエスケープされますが、引用符に限っては引用符でエスケープする必要があるためです。
Limit句
SELECT クエリには Limit 句を使用することができないため、次のような UNLOAD は失敗します。
UNLOAD ('SELECT * FROM users LIMIT 10') ...
その代わり Limit 句を使用したい場合は次のようにネストしたクエリであれば可能です。
UNLOAD ('SELECT * FROM users WHERE id IN (SELECT id FROM users ORDER BY id LIMIT 10)') ...