COPY INTOはSnowflakeのデータロード/アンロードの中核コマンドです。ステージからテーブルへのバルクロードとテーブルからステージへのデータエクスポートの両方を1つのコマンドで実行でき、FILE FORMAT・ON_ERROR・VALIDATION_MODEなどの豊富なオプションにより柔軟なデータパイプラインを構築できます。
SnowPro Core試験ではDomain 4(Data Loading & Unloading / 配点10〜15%)で出題され、Data Engineer試験ではさらに深いオプション知識が問われます。この記事では、実務設計の観点からCOPY INTOの全体像を整理し、試験頻出ポイントを解説します。
ステージからテーブルにデータをロードする基本構文です。
COPY INTO <テーブル名>
FROM @<ステージ名>/<パス>/
FILE_FORMAT = (FORMAT_NAME = '<ファイルフォーマット名>'
| TYPE = CSV | JSON | PARQUET | AVRO | ORC | XML)
PATTERN = '.*\.csv\.gz'
ON_ERROR = ABORT_STATEMENT | CONTINUE | SKIP_FILE | SKIP_FILE_<N>
PURGE = TRUE | FALSE
FORCE = TRUE | FALSE;| パラメータ | デフォルト | 説明 |
|---|---|---|
| FILE_FORMAT | CSV | ファイル形式の指定。名前付きFILE FORMATまたはインライン定義 |
| PATTERN | (なし) | 正規表現でロード対象ファイルをフィルタ |
| ON_ERROR | ABORT_STATEMENT | エラー発生時の動作。CONTINUE / SKIP_FILE も選択可 |
| PURGE | FALSE | TRUEにするとロード完了後にステージのファイルを自動削除 |
| FORCE | FALSE | TRUEにすると64日以内にロード済みのファイルも再ロード |
| VALIDATION_MODE | (なし) | ドライラン。RETURN_ERRORS / RETURN_ALL_ERRORS / RETURN_N_ROWS |
COPY INTOはデフォルトで64日間のロード履歴メタデータを保持し、同じファイルの重複ロードを自動的に防止します。ファイルのパス・サイズ・最終更新日時がメタデータと一致する場合、そのファイルはスキップされます。この動作はFORCE = TRUEで上書きできますが、通常は重複防止を有効にしたまま運用するのがベストプラクティスです。
テーブルからステージにデータをエクスポートする構文です。
COPY INTO @<ステージ名>/<パス>/
FROM <テーブル名> | (<SELECT文>)
FILE_FORMAT = (TYPE = CSV | JSON | PARQUET)
SINGLE = TRUE | FALSE
MAX_FILE_SIZE = <バイト数>
HEADER = TRUE | FALSE
OVERWRITE = TRUE | FALSE;| パラメータ | デフォルト | 説明 |
|---|---|---|
| SINGLE | FALSE | TRUEで1ファイルに統合出力。FALSEで並列分割出力 |
| MAX_FILE_SIZE | 16MB | 分割出力時の1ファイルの最大サイズ |
| HEADER | FALSE | TRUEでCSVのヘッダー行を出力 |
| OVERWRITE | FALSE | TRUEでステージの既存ファイルを上書き |
アンロード時のFROM句にはSELECT文を直接指定できるため、テーブル全体ではなくフィルタリング・集計・変換を行った結果をエクスポートすることが可能です。
FILE FORMATはデータの形式と解析ルールを定義するオブジェクトです。名前付きFILE FORMATとして事前に作成しておくことで、COPY INTO文のたびにオプションを記述する必要がなくなります。
CREATE FILE FORMAT my_csv_format
TYPE = CSV
FIELD_DELIMITER = ','
RECORD_DELIMITER = '\n'
SKIP_HEADER = 1
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ('NULL', 'null', '')
EMPTY_FIELD_AS_NULL = TRUE
COMPRESSION = GZIP;| フォーマット | 主な用途 | ロード | アンロード | 備考 |
|---|---|---|---|---|
| CSV | 汎用テキストデータ | ○ | ○ | SKIP_HEADER・FIELD_DELIMITER等が重要 |
| JSON | 半構造化データ | ○ | ○ | STRIP_OUTER_ARRAY・STRIP_NULL_VALUESが頻出 |
| Parquet | 列指向分析データ | ○ | ○ | SNAPPY圧縮がデフォルト |
| Avro | スキーマ付きバイナリ | ○ | ○ | スキーマ進化をサポート |
| ORC | Hadoop連携 | ○ | × | ロードのみ対応 |
| XML | レガシーシステム連携 | ○ | × | ロードのみ対応 |
ON_ERRORはデータロード時のエラーハンドリング戦略を決定する重要なパラメータです。
| ON_ERROR値 | 動作 | 推奨シーン |
|---|---|---|
| ABORT_STATEMENT(デフォルト) | 1行でもエラーがあれば全体をロールバック | 品質が保証されたデータの本番ロード |
| CONTINUE | エラー行をスキップし正常行のみロード | 品質にばらつきがある外部データ |
| SKIP_FILE | エラーを含むファイルをスキップ | 多数ファイルの一括ロード |
| SKIP_FILE_<N> | エラーがN行以上のファイルのみスキップ | 一定の品質基準でフィルタリング |
| SKIP_FILE_<N>% | エラー率がN%以上のファイルのみスキップ | 割合ベースの品質フィルタリング |
ON_ERROR = CONTINUEを使用した場合、スキップされたエラー行の詳細はVALIDATE関数で事後確認できます。SELECT * FROM TABLE(VALIDATE(my_table, JOB_ID => '_last'))で直前のCOPY INTOのエラー行を取得できます。
VALIDATION_MODEを指定するとデータのロードは行われず、ファイルの検証結果のみを返します。本番ロード前の事前チェックに必須の機能です。
| モード | 動作 | 用途 |
|---|---|---|
| RETURN_<N>_ROWS | 最初のN行をバリデーションし結果を返す | ファイルフォーマットの動作確認 |
| RETURN_ERRORS | エラー行のみを返す(最大ファイル制限あり) | 本番ロード前の品質チェック |
| RETURN_ALL_ERRORS | 全ファイルの全エラー行を返す | 包括的な品質レポートの生成 |
COPY INTO my_table
FROM @my_stage/data/
FILE_FORMAT = (FORMAT_NAME = 'my_csv_format')
VALIDATION_MODE = 'RETURN_ERRORS';| ステージ種類 | 管理者 | 共有 | 用途 |
|---|---|---|---|
| ユーザーステージ(@~) | Snowflake | 個人のみ | 個人の一時ファイル置き場 |
| テーブルステージ(@%table) | Snowflake | テーブル単位 | 特定テーブルへのロード専用 |
| 名前付き内部ステージ | Snowflake | ロールで制御 | チーム共有のファイル管理 |
| 外部ステージ(S3/Azure/GCS) | クラウドプロバイダー | IAMで制御 | 既存のクラウドストレージとの連携 |
COPY INTO文にインラインでフォーマットオプションを記述すると、メンテナンスが困難になります。CREATE FILE FORMATで名前付きオブジェクトを作成し、COPY INTO文ではFORMAT_NAME参照を使用してください。フォーマットの変更が発生した場合、FILE FORMATオブジェクト1箇所の修正で全COPY INTO文に反映されます。
特に外部パートナーから受領したCSVファイルなど、品質が保証されていないデータをロードする場合は、VALIDATION_MODE = 'RETURN_ERRORS'で事前検証を実施してください。ファイルフォーマットの不一致・データ型エラー・NULL制約違反を本番ロード前に検出できます。
ロード完了後のファイルをステージに残したままにすると、ストレージコストが累積し、次回のCOPY INTO実行時にファイル一覧の取得が遅くなります。PURGE = TRUEを指定してロード済みファイルを自動削除するか、定期的にREMOVE @stageでクリーンアップしましょう。
Snowflakeのドキュメントでは、COPY INTOの最適なファイルサイズとして圧縮後100〜250MBを推奨しています。ファイルが小さすぎると(数KB〜数MB)オーバーヘッドが大きくなり、大きすぎると(1GB超)並列処理の効率が低下します。
SnowPro Core - Data Loading
問題 1
COPY INTOコマンドでON_ERROR = 'CONTINUE'を指定した場合の動作として正しいものはどれですか?
正解: B
ON_ERROR = 'CONTINUE'を指定すると、エラーが発生した行(行レベルのデータ型エラー・NULL制約違反など)をスキップし、正常な行のみをテーブルにロードします(B:正解)。選択肢AはON_ERROR = 'ABORT_STATEMENT'(デフォルト)の動作です。選択肢CはON_ERROR = 'SKIP_FILE'の動作で、ファイル単位でスキップします。選択肢Dのような「エラー行を含めて全行ロード」する動作はどのON_ERRORオプションでも発生しません。CONTINUEでスキップされたエラー行の詳細は、VALIDATE関数(SELECT * FROM TABLE(VALIDATE(table, JOB_ID => '_last')))で事後確認できます。
COPY INTOとSnowpipeはどう使い分けますか?
COPY INTOはバッチ処理でまとまったファイルを一括ロードする場合に使用し、SnowpipeはファイルがStageに到着するたびに自動的にロードする場合に使用します。COPY INTOはVirtual Warehouseのコンピュートを使用し、実行タイミングを明示的に制御できます。一方、Snowpipeはサーバレスコンピュートで動作し、クラウドストレージのイベント通知(S3: SQS / Azure: Event Grid / GCP: Pub/Sub)をトリガーに自動実行されます。日次バッチロードならCOPY INTO、ニアリアルタイムの継続的インジェストならSnowpipeが適しています。コスト面では、ファイルサイズが大きくロード頻度が低い場合はCOPY INTOが、ファイルサイズが小さく頻繁にロードする場合はSnowpipeが有利です。
ON_ERRORオプションはどれを選ぶべきですか?
ON_ERRORオプションの選択は、データ品質要件と業務影響度によって決まります。本番データの初回ロードや品質が検証済みのデータにはABORT_STATEMENT(デフォルト)を推奨します。1行でもエラーがあれば全体をロールバックするため、データの整合性が保証されます。品質にばらつきがあるデータ(外部パートナーのCSVなど)にはCONTINUEを使用し、エラー行をスキップしてロード後にエラー行を別途処理します。SKIPFILEは多数のファイルを一括ロードする場合に有効で、エラーを含むファイルだけをスキップし正常なファイルはロードします。SKIP_FILE_<N>やSKIP_FILE_<N>%はエラー許容閾値を設定できます。
VALIDATION_MODEとは何ですか?
VALIDATION_MODEはCOPY INTOの「ドライラン」機能で、実際にデータをロードせずにファイルの検証だけを行います。RETURN_<N>_ROWS(最初のN行を返す)、RETURN_ERRORS(エラー行のみ返す)、RETURN_ALL_ERRORS(全エラー行を返す)の3つのモードがあります。本番ロード前にVALIDATION_MODE = 'RETURN_ERRORS'で事前検証を実行し、ファイルフォーマットの不一致やデータ型エラーを事前に検出するのがベストプラクティスです。VALIDATION_MODEを指定するとデータのロードは一切行われないため、安全にテストできます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...