re develop

re:develop

Redshift Auto Copy from S3のS3パスの注意点について

こちらの記事にて、Auto Copy JOBを設定する方法を記載しました。

その際に、Query Editor V2にてAuto Copy JOBを設定するには以下のクエリを実行します。

COPY データベース.スキーマ.テーブル(
  カラム,
  カラム
) FROM 's3://バケット/フォルダ/フォルダ/フォルダ/'
IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxxx:role/service-role/AmazonRedshift-CommandsAccessRole-xxxxxxxxxxx'
CSV
IGNOREHEADER 1
DELIMITER ','
JOB CREATE xxxxxxxxxxxxxxxxxx
AUTO ON
;

この時に、S3のパスを設定するのですがある意味使えるようで使えないような仕様があります。

もし仮に、以下のS3パスのフォルダ以下にファイルが追加されたらAuto Copy JOBが動作するようにしたいとします。

s3://test-bucket/test-folder-1/test-folder-2/

この場合、test-folder-2以下にファイル名が重複しないファイルが追加されるたびにAuto Copy JOBが動作します。

ですが、ここで注意点があります。もしS3パスの最後の / を取るとどの様な挙動になるでしょうか。

s3://test-bucket/test-folder-1/test-folder-2

この場合も、test-folder-2以下にファイルが追加されるとAuto Copy JOBが動作します。

しかし、以下のS3パスのファイルも取り込んでしまいます。

  • s3://test-bucket/test-folder-1/test-folder-2-1
  • s3://test-bucket/test-folder-1/test-folder-2-sample

S3パスの最後にきっちり / を指定しない場合、前方一致したフォルダのファイルも取りこもうとしてしまいます。

この仕様は特定のケースで利用できそうではありますが、バグを発生させかねないのでS3のパスをきっちり指定し、S3のフォルダ構造やファイルの持ち方をよく検討したほうが良さそうです。

(先の例はCOPYコマンドでカラムを指定している場合、取り込みの時にファイル構造とテーブル構造が一致していないと取り込むことはできませんが、パーティション分けしているファイル等、同じ構造のファイルを似通った名前のフォルダに保存しているとこのような事が起きやすいのでは?というか、起こしてしまいました。)