Amazon Redshift:UNLOAD処理実行時の最大ファイルサイズを指定出来るMAXFILESIZEオプションについて

2017.09.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

小ネタです。

Amazon RedshiftでUNLOAD処理を行う際、デフォルトでは最大ファイルサイズは6.2GBとなっています。下記エントリで紹介しているように、PARALLELオプションをOFFとする事でファイルの出力が1つのファイルに集約される事になり、そのサイズが6.2GB(の制限)を超えたところで別のファイルとして出力されるようになる...という挙動となっていました。

現在では、このファイル最大サイズを変更することが可能となっています。当エントリではその内容について簡単にではありますが紹介したいと思います。

MAXFILESIZEオプションで出力するファイル(毎)の最大サイズを指定可能に

UNLOAD処理時のファイルサイズの指定はMAXFILESIZEオプションで指定が可能となっています。以下はUNLOADコマンドのシンタックスですが、MAXFILESIZE [AS] max-size [ MB | GB ]の形でオプション指定する事で制御が可能となります。

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

オプションを用いることで実際にどのような挙動を見せるのか、確認してみたいと思います。まずは通常の操作から。PARALLEL OFFにしてファイルサイズが6.2GBを超えるようなクエリを実行し、ファイルをエクスポートしてみます。

# UNLOAD ('SELECT * FROM public.lineorder WHERE lo_orderpriority=\'1-URGENT\'')
TO 's3://xxxxxxxxxxxxxx/lineorder-maxsize-default/lineorder-'
CREDENTIALS 'aws_access_key_id=XXXXX;aws_secret_access_key=YYYYY'
DELIMITER AS '\t'
PARALLEL OFF;

実行結果は以下の様になりました。1つ目のファイルが6.2GBを超えた時点で次のファイルへの出力がなされている事が確認出来ています。

redshift-unload-maxfilesize_01

次いでオプション指定ありの実行のケース。ここではMAXFILESIZEを2 GBと指定してUNLOAD処理を実行してみました。

# UNLOAD ('SELECT * FROM public.lineorder WHERE lo_orderpriority=\'1-URGENT\'')
TO 's3://xxxxxxxxxxxxxx/lineorder-maxsize-specified/lineorder-'
CREDENTIALS 'aws_access_key_id=XXXXX;aws_secret_access_key=YYYYY'
DELIMITER AS '\t'
PARALLEL OFF
MAXFILESIZE AS 2 GB;

実行結果を確認してみると以下の様に最大ファイルサイズが2.0GBの時点で別のファイルとして出力している事が確認出来ました。

redshift-unload-maxfilesize_02

という訳で、Amazon RedshiftのUNLOADコマンドにおけるMAXFILESIZEオプションの紹介でした。任意のファイルサイズで出力が出来るようになった事でUNLOADの使い方にも色々幅が効きそうな感じがします。