goodbyegangsterのブログ

備忘録的な

Redshiftで、ファイルを指定してCOPY処理をする方法

Redshiftにデータを投入する方法は色々用意されていまうが、一般的には(且つ推奨されている方法では)、RedshiftのCOPYコマンドを利用する方法です。

基本的にロードしたいファイルをS3上に置いておき、COPYすることになるのですが、COPYコマンドのみでの実行では、S3のフォルダ単位で指定はできるものの、ファイル単位での指定はできません。その場合に利用するのがマニュフェスト・ファイルとなります。マニュフェストファイルとは、COPY時にロードしたいファイルの情報をJOSN形式で記載したものになります。

マニュフェスト・ファイルのフォーマットは以下となります。 mandatory フラグは、対象ファイルが見つからない場合での動作になります。trueではエラーを返してCOPY処理は実行されません。falseでは見つからないファイルを無視して、COPY処理が実行されます。

{
   "entries":[
      { "url":"s3://redshift-data/test/000001.csv","mandatory":true },
      { "url":"s3://redshift-data/test/000002.csv","mandatory":true },
      { "url":"s3://redshift-data/test/000003.csv","mandatory":true }
   ]
}

上記のCOPYさせたいファイル情報を記載したファイルを、S3上の適当なパスに置いてあげます。そして、COPYコマンドを実行する際に、このマニュフェスト・ファイルを指定します。

COPYコマンド例はこちら。 MANIFEST というオプションを付与しています。通常のCOPYコマンド実行時に指定できるその他オプション(GZIP, BLANKSASNULL等)も、指定できます。Redshiftから、ロードするファイルのみでなく、マニュフェスト・ファイルにもアクセスできるよう、必要権限をもったIAMロールを付与してあげてください。

COPY public.test_table
FROM 's3://redshift-data/test.manifest'
iam_role 'arn:aws:iam::XXXXXXXXXX:role/ServiceRoleForRedshift'
MANIFEST;

公式のマニュアルはこちらです。

マニフェストを使用し、データファイルを指定する - Amazon Redshift