[AWS] S3からRedshiftにCOPYする際にマニフェストで対象ファイルを複数指定する。

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

はじめに

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

さいごに

マニフェストは色々な事に使えるようなので、それらについてもいずれ書いていければと思います。