🐌

Redshiftでマニフェストファイルを使用したCOPYコマンド【備忘】

2024/05/01に公開

TL;DR

  • マニフェストファイルを任意のS3に配置する
{
    "entries": [
        {"url": "s3://hoge/fuga.json", "mandatory": true},
        {"url": "s3://hoge/piyo.json", "mandatory": true},
    ]
}
  • 以下のCOPYコマンドを実行する
COPY sample_table
FROM 's3://sample/sample_manifest.json'
iam_role 'arn:aws:iam::〜〜'
json 'auto'
manifest;

経緯

  • 某案件に参画して2年が経過
  • 案件内のジョブで、複数ファイルをRedshiftに取り込むような場合、ファイルの数だけCOPYを実行している(が、慣れ切ってしまって違和感すら抱かなかった)
  • AWS試験をきっかけにマニフェストコマンドを知る
  • ちょうど仕掛かり中のタスクで複数ファイル取り込みがあったので、共通関数にマニフェストファイルを作成する関数を作って実装 ←今ここ
  • 既存の複数ファイル取り込みにも適用したい

マニフェストファイルを使うと何が嬉しいのか

  • 複数のCOPY文で実行するよりも、単一のCOPY文で実行した方が効率が良いらしい
  • 公式ドキュメントによると、単一のCOPY文だと勝手に並列処理してくれるらしい
    • 複数のCOPY文にすると、1つずつクエリが終わってから次のクエリを実行するので、直列処理になってしまう、という理解

mandatoryについて

  • マニフェストファイルのmandatoryをfalseにしておくと、そのファイルを取り込む際エラーになったとしても、他のファイル取り込みを続行してくれる
    • (個人的には、ちゃんとエラーを吐いてくれた方が嬉しいのでtrue固定でいいと思っている)

Discussion