Databricks Certified Data Engineer Associate 教科書
第2章 データ取り込みとロード(Data Ingestion and Loading, 21%)
🎯 この節の学習目標
FILEFORMAT・FORMAT_OPTIONS・COPY_OPTIONS(mergeSchema を含む)の構文を読み書きできるCOPY INTO は、クラウドオブジェクトストレージ(S3 / ADLS / GCS)上のファイルを Delta テーブルへ読み込む SQL コマンドです。最大の特徴は冪等性(idempotency)にあります。COPY INTO は「どのファイルをロード済みか」をターゲットテーブル側で記録しており、同じコマンドを何度実行しても、一度ロードしたファイルはスキップされ、新しく追加されたファイルだけが取り込まれます。
このため、同じ COPY INTO 文を毎日スケジュール実行するだけで、増分ロードのパイプラインが完成します。「再実行しても二重ロードにならない」性質は、ジョブの失敗リトライ時にも安全に働きます。
📝 試験のポイント
「COPY INTO を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_OPTIONS | COPY INTO 自体の動作に関するオプション | 'mergeSchema'(スキーマ差分の吸収)、'force'(スキップを無効化して再ロード) |
FORMAT_OPTIONS と COPY_OPTIONS の役割の違いは選択肢の作り分けに使われます。「ファイルをどう解釈するか」は FORMAT_OPTIONS、「ロード動作をどう制御するか」は COPY_OPTIONS、と対応づけて覚えてください。
ソースファイルに新しい列が増えたとき、既定の 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;
図:COPY INTO による増分ロードの流れ
COPY INTO と Auto Loader(2-3)はどちらも「クラウドストレージからの増分ファイルロード」を担うため、使い分けが問われます。
| 観点 | COPY INTO | Auto Loader |
|---|---|---|
| 書き方 | SQL コマンド。SQL 中心のチームに馴染む | Structured Streaming(主に PySpark) |
| スケール | 数千ファイル規模までが目安。ディレクトリ内の全ファイル一覧と照合するため、ファイル数が増えると照合コストが増す | 数百万ファイル規模にも対応。チェックポイントと通知モードで効率的に検出 |
| スキーマ進化 | mergeSchema で新列追加に対応 | スキーマ推論・進化・rescued data column まで含む高機能な対応 |
| ファイル検出 | 実行時にリスティングして照合 | directory listing / file notification(通知ベース)を選択可能 |
| 実行スタイル | スケジュール実行のバッチ | 継続ストリーミングにも availableNow のバッチ的実行にも対応 |
📝 試験のポイント
使い分けの目安:「SQL だけで完結させたい・ファイル数は数千程度・定時のスケジュール実行」なら COPY INTO、「ファイル数が非常に多い・継続的に到着する・スキーマ進化への高度な対応が必要」なら Auto Loader です。問題文にある規模感と実行スタイルの記述が判断の決め手になります。
COPY_OPTIONS ('force' = 'true') でスキップを無効化できます。ただし重複挿入になるため、通常運用では使いません。✅ この節のまとめ
FILEFORMAT(形式)+ FORMAT_OPTIONS(ファイルの読み方)+ COPY_OPTIONS(ロード動作の制御)。mergeSchema は COPY_OPTIONS 側で、新列をスキーマへ自動追加する。問1. 毎晩スケジュール実行している COPY INTO ジョブが一時的なエラーで失敗し、同じ文をそのまま再実行した。すでに前回までにロード済みだったファイルはどうなるか。
正解:B
COPY INTO は冪等であり、ロード済みファイルの記録に基づいて既処理ファイルをスキップします。再実行やリトライで重複が生じないのが最大の利点です(Aは誤り)。再実行がエラーになることも、ソースファイルが削除されることもありません(C・Dは誤り)。なお 'force' = 'true' を明示した場合のみスキップが無効になり再ロードされます。
問2. ソースの CSV ファイルに新しい列が追加されるようになり、COPY INTO がスキーマ不一致で失敗する。新しい列をターゲットテーブルに自動追加してロードを継続したい。正しい指定はどれか。
FORMAT_OPTIONS ('mergeSchema' = 'true')COPY_OPTIONS ('mergeSchema' = 'true')COPY_OPTIONS ('force' = 'true')FILEFORMAT = SCHEMA_EVOLUTION正解:B
スキーマの自動拡張は COPY INTO 自体の動作制御なので COPY_OPTIONS 側に 'mergeSchema' = 'true' を指定します。Aはオプションを指定する場所が誤りです(FORMAT_OPTIONS はファイルの読み方の指定)。Cの force はロード済みファイルの再ロードを強制するオプションで、スキーマとは無関係です。Dのような FILEFORMAT 値は存在しません。
問3. SQL 中心のチームが、ADLS 上のディレクトリに1日あたり数十個、累計でも数千程度のファイルを日次バッチで取り込む。追加の運用負荷を最小にしたい場合、最も適切な手段はどれか。
正解:A
「SQL 中心・数千ファイル規模・日次スケジュール」は COPY INTO の得意領域そのものです。Bも技術的には可能ですが、この規模で常時稼働のストリーミングと通知インフラを構えるのは過剰であり、運用負荷最小という要件に合いません。Cは増分ではなく全件再処理でありコストが無駄です。Dは誤りで、JDBC はデータベース接続用のプロトコルであり、オブジェクトストレージのファイル読み取りには使いません。
問4. FORMAT_OPTIONS と COPY_OPTIONS の役割分担として正しいものはどれか。
正解:B
FORMAT_OPTIONS は header や delimiter などの「ファイルをどう読むか」、COPY_OPTIONS は mergeSchema や force などの「COPY INTO がどう振る舞うか」を指定します。Aは役割が逆、Cは誤り(指定場所を間違えるとエラーや無視の原因になります)、Dはファイル形式との対応づけが誤りです(FORMAT_OPTIONS の中身が形式ごとに変わるだけで、句自体はどの形式でも使います)。