Snowflake COPY INTOでファイルからテーブルへデータ投入する方法

Snowflake COPY INTOでファイルからテーブルへデータ投入する方法 Snowflake

はじめに:COPY INTOってなに?

こんにちは!今回は、Snowflakeでファイルからテーブルにデータを取り込むときの主役、COPY INTO <table> コマンドをやさしく解説します。CSVやJSONをドンとロードしたい初心者の方にぴったりの内容ですよ。

「データウェアハウスにデータを入れる」と聞くと難しそうに感じますが、Snowflakeではたった1行のSQLで大量のファイルを取り込めます。バルクロード(まとめてロード)の流れ全体については Snowflakeデータロードの全体像|バルク・ストリーミング・サードパーティをやさしく解説 を先に読むと、より理解が深まります。

Snowflake COPY INTOでステージを経由してCSVやJSONをテーブルへバルクロードする流れを示すフロー図

基本の仕組み:ステージ→テーブルの2ステップ

COP INTOは、いきなりPCのファイルをテーブルに入れるのではなく、まずステージと呼ばれる一時置き場にファイルを置き、そこからテーブルへロードするのが基本です。

ステージの種類や役割は Snowflakeステージとは?内部・外部ステージをやさしく解説 で詳しく紹介しています。ざっくり言うと、内部ステージはSnowflake内部のフォルダ、外部ステージはS3などクラウドストレージへのリンクです。

イメージはこんな感じ:

  • ローカルファイル → (PUT) → ステージ → (COPY INTO) → テーブル

具体的に書いてみよう:基本のSQL例

たとえば、employees.csvEMPLOYEES テーブルへロードする場合の流れを見てみましょう。

1. テーブルとステージを準備

-- テーブル作成
CREATE OR REPLACE TABLE employees (
  id     NUMBER,
  name   STRING,
  dept   STRING,
  salary NUMBER
);

-- 名前付き内部ステージ作成
CREATE OR REPLACE STAGE my_stage;

2. ファイルをステージに置く(SnowSQLから)

PUT file:///Users/me/employees.csv @my_stage;

SnowSQLの使い方は SnowSQLのインストールと基本的な使い方を初心者向けに解説 をどうぞ。

3. COPY INTOでロード!

COPY INTO employees
FROM @my_stage/employees.csv
FILE_FORMAT = (TYPE = 'CSV' FIELD_OPTIONALLY_ENCLOSED_BY = '"' SKIP_HEADER = 1)
ON_ERROR = 'CONTINUE';

これだけ!たった3ステップでデータが入ります。FILE_FORMAT はファイルの形式(区切り文字や引用符の扱い)を指定するオプション、ON_ERROR はエラー行が出た時の挙動を決めるオプションです。SnowSQLでPUTコマンドとSnowflake COPY INTOを実行しCSVをemployeesテーブルへ取り込む3ステップの手順

知っておきたい便利オプション

  • PATTERN: 正規表現で複数ファイルを一括指定(例: PATTERN = '.*sales_2026.*\.csv')
  • VALIDATION_MODE: RETURN_ERRORS を指定すると実際にロードせずエラー行だけ確認できる
  • PURGE = TRUE: ロード成功後にステージのファイルを自動削除
  • FORCE = TRUE: 同じファイルでも再ロード(通常は重複ロードを防ぐ仕組みあり)

よくあるユースケースと注意点

COPY INTOは、毎日深夜に届くCSVを翌朝のレポート前にバルク投入するような定期バッチロードで大活躍します。リアルタイム性が必要ならSnowpipeを使う、というすみ分けです。

注意点としては、ロード処理は仮想ウェアハウスのクレジットを消費するので、終わったらサスペンドさせる(自動サスペンド設定)とお財布にやさしいですよ。また、Snowflakeはデフォルトで同名同サイズのファイルは再ロードされないので、再投入したい時は FORCE = TRUE を忘れずに。

まとめ

COPY INTOは「ステージに置いて、テーブルに流し込む」というシンプルな仕組みでありながら、CSV/JSON/Parquetなど多彩な形式に対応する万能ロードコマンドです。まずは小さなCSVで試して、慣れてきたらFILE_FORMATオブジェクトを作り置きするなど、効率化していきましょう!

参考リンク

関連記事