AWS
redshift

RddshiftからS3へUNLOADする

More than 1 year has passed since last update.

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 ] ]

相変わらずわかりにくい構文っすよね。。。

簡単なサンプル

sample
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 句を使用してください。

sample
SELECT 
 * 
FROM 
 test 
WHERE id IN (
  SELECT 
   id
  FROM 
   test
  LIMIT 100
);

こんな感じにしろとのこと。

参考

UNLOAD