[AWS] S3からRedshiftにCOPYする際にマニフェストで対象ファイルを複数指定する。
はじめに
Redshiftのテーブルにロードする際に簡単なのは、S3にCSVファイルなりを配置してそれをロードする方法です。 ファイル名にプレフィックスを使用して複数をロードする事も可能ですが、プレフィックスになっていない場合ではファイル毎に実行する必要が出てくるので面倒です。そんな時にマニフェストを作成してCOPY時に読み込ませれば、そこに記述してあるファイル一覧をロードできて便利です。 扱い方について調べたので記事にしておきます。
マニフェストについて
対象ファイルへの接続方法や処理について記述しておき、ロード時にマニフェストを読み込んでその指示通りに処理できるようにするものと理解しています。
環境
Windows10 Aginity For Redshift
準備
テーブル作成
create schema test; create table test.tablea ( id integer ,item varchar(15) ,price integer ,primary key(id) ) sortkey(id);
CSVファイル作成
test_tablea_1.csv
id,item,price 1,apple,100 2,banana,200 3,orange,300
s3://mybucket/test/に配置。
test_tablea_2.csv
id,item,price 4,strawberry,400 5,water melon,500 6,melon,600
s3://mybucket/test/test_sub/に配置。
マニフェスト作成(test.manifest)
{ "entries": [ {"url":"s3://cm-takahara-test/test/test_sub/test_tablea_2.csv", "mandatory":true}, {"url":"s3://cm-takahara-test/test/test_tablea_1.csv", "mandatory":true} ] }
s3://mybucket/test/に配置。 JSON形式。 ここでは、2項目の設定のみとなっています。 「url」は、見ての通り対象ファイルのパスです。ファイルの配置場所が違っても問題ありません。 「mandatory」は、対象ファイルが見つからなかった場合にエラーを返してロードを中止するかどうかです。 デフォルトはfalseで、trueにするとエラーを返します。
COPY
実行
COPY test.tablea FROM 's3://mybucket/test/test.manifest' CREDENTIALS 'aws_access_key_id=XXXXX;aws_secret_access_key=YYYYY' CSV DELIMITER ',' IGNOREHEADER 1 MANIFEST;
また、実行には下記条件があります。 ・FROM句にマニフェストのパスを記述。 ・COPY文に「MANIFEST」の記述。 ・クラスターとバケットが同リージョンである。
結果
select * from test.tablea order by id; id | item | price ----------------------- 1 |apple | 100 2 |banana | 200 3 |orange | 300 4 |strawberry | 400 5 |water melon| 500 6 |melon | 600
さいごに
マニフェストは色々な事に使えるようなので、それらについてもいずれ書いていければと思います。