S3へ書き出したDynamoDBデータをRedshiftへコピーする [Copyコマンドについて]の逆をする。
UNLOADコマンドを使用する際の個人的な確認用まとめ
構文(抜粋)
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
authorization
[ option [ ... ] ]
where option is
{ MANIFEST
| DELIMITER [ AS ] 'delimiter-char'
| FIXEDWIDTH [ AS ] 'fixedwidth-spec' }
| ENCRYPTED
| BZIP2
| GZIP
| ADDQUOTES
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
[ MAXFILESIZE [AS] max-size [ MB | GB ] ]
相変わらずわかりにくい構文っすよね。。。
簡単なサンプル
UNLOAD ('SELECT * FROM test;')
TO 's3://mybucket_name/target_dir/'
CREDENTIALS 'aws_access_key_id=<キー>;aws_secret_access_key=<シークレットキー>'
MANIFEST
DELIMITER AS '\t'
GZIP
ALLOWOVERWRITE
UNLOAD ('select-statement')
SQL文を書く。途中で ''
を使用したい場合はちゃんとエスケープすること \'\'
TO 's3://object-path/name-prefix'
出力先のS3を指定する。
object-path
配下に name-prefixXXXXXXXXXXXX
で作成される。
CREDENTIALS
COPYにも書いたけどIAMなりクレデンシャルキーなり指定する
オプション指定
MANIFEST
DELIMITER [ AS ] 'delimiter-char'
FIXEDWIDTH [ AS ] 'fixedwidth-spec' }
ENCRYPTED
BZIP2
GZIP
ADDQUOTES
NULL [ AS ] 'null-string'
ESCAPE
ALLOWOVERWRITE
PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
MAXFILESIZE [AS] max-size [ MB | GB ] ]
幾つかかいつまんで
MANIFEST
UNLOAD プロセスによって作成されたデータファイルを明示的にリストするマニフェストファイルを作成します。
DELIMITER
パイプ文字 (|)、カンマ (,)、タブ (\t) など、出力ファイル内のフィールドを分離する単一の ASCII 文字。デフォルトの区切り文字はパイプ文字です。
BZIP2/GZIP
出力時に圧縮して出力する
ADDQUOTES
アンロードされた各データフィールドは引用符で囲まれるため、Amazon Redshift は区切り文字自体を含んでいるデータ値をアンロードすることができます。
出力データに区切り文字が含まれている場合、カラム毎に ””
で囲んで出力してくれる機能
読み込み時の使い方に寄る。
NULL AS 'null-string'
NULL文字の置き換え
ALLOWOVERWRITE
デフォルトでは、UNLOAD によってファイルの上書きが発生する可能性がある場合、その UNLOAD 操作は失敗します。ALLOWOVERWRITE が指定された場合、UNLOAD によって、マニフェストファイルを含めた既存のファイルが上書きされます。
ファイルが存在すると上書き禁止でエラー終了する。
これを指定すると上書きする。
MAXFILESIZE AS 最大サイズ [ MB | GB ]
Amazon S3 で作成された UNLOAD ファイルの最大サイズ。5 MB ~ 6.2 GB の十進値を指定します。AS キーワードはオプションです。デフォルト単位は MB です。MAXFILESIZE を指定しない場合、デフォルトの最大ファイルサイズは 6.2 GB です。
マニフェストファイルが使用されている場合、このサイズは MAXFILESIZE に影響されません。
LIMIT
SELECT クエリは、外部の SELECT で LIMIT 句を使用することはできません。その代わり、ネスティングされた LIMIT 句を使用してください。
SELECT
*
FROM
test
WHERE id IN (
SELECT
id
FROM
test
LIMIT 100
);
こんな感じにしろとのこと。