第2章 データ取り込みとロード / 想定学習時間:30〜40分 / 最終確認:2026年8月

2-2. COPY INTOによるクラウドストレージからの増分ロード

🎯 この節の学習目標

1. COPY INTO とは:SQL で書ける冪等な増分ロード

COPY INTO は、クラウドオブジェクトストレージ(S3 / ADLS / GCS)上のファイルを Delta テーブルへ読み込む SQL コマンドです。最大の特徴は冪等性(idempotency)にあります。COPY INTO は「どのファイルをロード済みか」をターゲットテーブル側で記録しており、同じコマンドを何度実行しても、一度ロードしたファイルはスキップされ、新しく追加されたファイルだけが取り込まれます

このため、同じ COPY INTO 文を毎日スケジュール実行するだけで、増分ロードのパイプラインが完成します。「再実行しても二重ロードにならない」性質は、ジョブの失敗リトライ時にも安全に働きます。

📝 試験のポイント

「COPY INTO を2回実行したらデータが重複するか?」という趣旨の問題では、重複しない(既ロードのファイルはスキップされる)が正解です。ただしスキップの単位は「ファイル」であることに注意してください。同じ内容でも別名の新ファイルとして置かれれば、それは新規ファイルとしてロードされます。

2. 基本構文

構文の骨格は「どのテーブルへ」「どこから」「何形式で」「どんなオプションで」の4要素です。

💡 具体例:S3 上の CSV を UC 管理テーブルへ増分ロードする

COPY INTO main.bronze.sales
FROM 's3://my-bucket/landing/sales/'
FILEFORMAT = CSV
FORMAT_OPTIONS (
  'header' = 'true',
  'inferSchema' = 'true'
)
COPY_OPTIONS (
  'mergeSchema' = 'true'
);

ADLS なら 'abfss://container@account.dfs.core.windows.net/landing/sales/'、GCS なら 'gs://my-bucket/landing/sales/' のようにパスを変えるだけで、同じ構文が使えます。ターゲットは Unity Catalog 管理下のテーブル(カタログ.スキーマ.テーブルの3階層名)を指定します。

役割代表的な指定
FILEFORMATソースファイルの形式CSV / JSON / PARQUET / AVRO / TEXT / BINARYFILE など
FORMAT_OPTIONSファイルの読み方に関するオプション(形式ごとに異なる)'header''inferSchema''delimiter'、JSON の 'multiLine' など
COPY_OPTIONSCOPY INTO 自体の動作に関するオプション'mergeSchema'(スキーマ差分の吸収)、'force'(スキップを無効化して再ロード)

FORMAT_OPTIONSCOPY_OPTIONS の役割の違いは選択肢の作り分けに使われます。「ファイルをどう解釈するか」は FORMAT_OPTIONS、「ロード動作をどう制御するか」は COPY_OPTIONS、と対応づけて覚えてください。

3. mergeSchema:スキーマ差分の吸収

ソースファイルに新しい列が増えたとき、既定の COPY INTO はターゲットテーブルのスキーマと一致しないためエラーになります。COPY_OPTIONS ('mergeSchema' = 'true') を指定すると、新しい列をターゲットテーブルのスキーマに自動追加してロードを続行できます。

-- 列が増えたファイルも受け入れる
COPY INTO main.bronze.events
FROM 's3://my-bucket/landing/events/'
FILEFORMAT = JSON
COPY_OPTIONS ('mergeSchema' = 'true');

また、SELECT 句を挟んで列の変換・選択をしながらロードすることもできます。

COPY INTO main.bronze.sales
FROM (
  SELECT
    _c0::INT   AS sale_id,
    _c1::DATE  AS sale_date,
    _c2::DOUBLE AS amount,
    current_timestamp() AS ingested_at
  FROM 's3://my-bucket/landing/sales/'
)
FILEFORMAT = CSV;

4. 実行の流れ

クラウドストレージs3:// abfss:// gs:// にファイルが追加される
COPY INTO 実行(手動または Lakeflow Jobs でスケジュール)
ロード済みファイルの照合ターゲットテーブルが記録を保持
未ロードのファイルだけを選別
新規ファイルのみロードmergeSchema 指定時は新列も追加
UC 管理 Delta テーブルに追記再実行しても二重ロードなし(冪等)

図:COPY INTO による増分ロードの流れ

5. COPY INTO が適する場面と Auto Loader との比較

COPY INTO と Auto Loader(2-3)はどちらも「クラウドストレージからの増分ファイルロード」を担うため、使い分けが問われます。

観点COPY INTOAuto Loader
書き方SQL コマンド。SQL 中心のチームに馴染むStructured Streaming(主に PySpark)
スケール数千ファイル規模までが目安。ディレクトリ内の全ファイル一覧と照合するため、ファイル数が増えると照合コストが増す数百万ファイル規模にも対応。チェックポイントと通知モードで効率的に検出
スキーマ進化mergeSchema で新列追加に対応スキーマ推論・進化・rescued data column まで含む高機能な対応
ファイル検出実行時にリスティングして照合directory listing / file notification(通知ベース)を選択可能
実行スタイルスケジュール実行のバッチ継続ストリーミングにも availableNow のバッチ的実行にも対応

📝 試験のポイント

使い分けの目安:「SQL だけで完結させたい・ファイル数は数千程度・定時のスケジュール実行」なら COPY INTO、「ファイル数が非常に多い・継続的に到着する・スキーマ進化への高度な対応が必要」なら Auto Loader です。問題文にある規模感と実行スタイルの記述が判断の決め手になります。

6. 運用上の注意

✅ この節のまとめ

練習問題

問1. 毎晩スケジュール実行している COPY INTO ジョブが一時的なエラーで失敗し、同じ文をそのまま再実行した。すでに前回までにロード済みだったファイルはどうなるか。

  1. すべて再ロードされ、テーブルに重複行が発生する
  2. ロード済みファイルはスキップされ、未ロードのファイルだけが取り込まれる
  3. エラーになり、テーブルを作り直すまで再実行できない
  4. ロード済みファイルは削除される
解答と解説を見る

正解:B

COPY INTO は冪等であり、ロード済みファイルの記録に基づいて既処理ファイルをスキップします。再実行やリトライで重複が生じないのが最大の利点です(Aは誤り)。再実行がエラーになることも、ソースファイルが削除されることもありません(C・Dは誤り)。なお 'force' = 'true' を明示した場合のみスキップが無効になり再ロードされます。

問2. ソースの CSV ファイルに新しい列が追加されるようになり、COPY INTO がスキーマ不一致で失敗する。新しい列をターゲットテーブルに自動追加してロードを継続したい。正しい指定はどれか。

  1. FORMAT_OPTIONS ('mergeSchema' = 'true')
  2. COPY_OPTIONS ('mergeSchema' = 'true')
  3. COPY_OPTIONS ('force' = 'true')
  4. FILEFORMAT = SCHEMA_EVOLUTION
解答と解説を見る

正解:B

スキーマの自動拡張は COPY INTO 自体の動作制御なので COPY_OPTIONS 側に 'mergeSchema' = 'true' を指定します。Aはオプションを指定する場所が誤りです(FORMAT_OPTIONS はファイルの読み方の指定)。Cの force はロード済みファイルの再ロードを強制するオプションで、スキーマとは無関係です。Dのような FILEFORMAT 値は存在しません。

問3. SQL 中心のチームが、ADLS 上のディレクトリに1日あたり数十個、累計でも数千程度のファイルを日次バッチで取り込む。追加の運用負荷を最小にしたい場合、最も適切な手段はどれか。

  1. COPY INTO を Lakeflow Jobs で日次スケジュール実行する
  2. Auto Loader を file notification モードで常時稼働させる
  3. 毎日 CREATE OR REPLACE TABLE で全ファイルを読み直す
  4. JDBC で ADLS に接続して読み取る
解答と解説を見る

正解:A

「SQL 中心・数千ファイル規模・日次スケジュール」は COPY INTO の得意領域そのものです。Bも技術的には可能ですが、この規模で常時稼働のストリーミングと通知インフラを構えるのは過剰であり、運用負荷最小という要件に合いません。Cは増分ではなく全件再処理でありコストが無駄です。Dは誤りで、JDBC はデータベース接続用のプロトコルであり、オブジェクトストレージのファイル読み取りには使いません。

問4. FORMAT_OPTIONS と COPY_OPTIONS の役割分担として正しいものはどれか。

  1. FORMAT_OPTIONS はロード動作の制御、COPY_OPTIONS はファイルの解釈方法を指定する
  2. FORMAT_OPTIONS はファイルの解釈方法(ヘッダー有無・区切り文字など)、COPY_OPTIONS は COPY INTO 自体の動作(mergeSchema・force など)を指定する
  3. 両者は完全に同じもので、どちらに書いても動作は変わらない
  4. FORMAT_OPTIONS は CSV 専用、COPY_OPTIONS は JSON 専用のオプションである
解答と解説を見る

正解:B

FORMAT_OPTIONS は headerdelimiter などの「ファイルをどう読むか」、COPY_OPTIONS は mergeSchemaforce などの「COPY INTO がどう振る舞うか」を指定します。Aは役割が逆、Cは誤り(指定場所を間違えるとエラーや無視の原因になります)、Dはファイル形式との対応づけが誤りです(FORMAT_OPTIONS の中身が形式ごとに変わるだけで、句自体はどの形式でも使います)。