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

2-3. Auto Loader(スキーマ強制・スキーマ進化・directory listing/file notification)

🎯 この節の学習目標

1. Auto Loader とは:ストリーミング基盤の増分ファイル取り込み

Auto Loader は、クラウドオブジェクトストレージに到着する新しいファイルを増分的に検出してロードする Structured Streaming のソースです。コード上はフォーマット名 cloudFiles として登場します。COPY INTO と同じく「一度処理したファイルは二度処理しない」性質を持ちますが、その記録方法が異なります。Auto Loader はチェックポイント(checkpoint)に処理済みファイルの情報を永続化し、障害時もチェックポイントから正確に一度(exactly-once)の保証つきで再開できます。

💡 具体例:S3 の JSON を Auto Loader で取り込む(PySpark)

(spark.readStream
  .format("cloudFiles")
  .option("cloudFiles.format", "json")
  .option("cloudFiles.schemaLocation", "s3://my-bucket/_schemas/events/")
  .load("s3://my-bucket/landing/events/")
  .writeStream
  .option("checkpointLocation", "s3://my-bucket/_checkpoints/events/")
  .trigger(availableNow=True)
  .toTable("main.bronze.events")
)

ポイントは3つです。(1) format("cloudFiles") が Auto Loader の指定、(2) cloudFiles.schemaLocation に推論したスキーマの保存先を指定、(3) checkpointLocation が既処理ファイルの記録場所です。書き込み先は toTable() で UC 管理テーブルを指定します。

2. スキーマ推論・スキーマ進化・rescued data column

Auto Loader の強みは、スキーマの扱いが高機能なことです。3つの概念を区別して押さえます。

2-1. スキーマ推論(schema inference)

スキーマを明示しなくても、Auto Loader が初回にファイルをサンプリングしてスキーマを推論し、cloudFiles.schemaLocation に保存します。以降の実行はこの保存済みスキーマを起点に動くため、実行のたびに推論結果が揺れることはありません。

2-2. スキーマ進化(schema evolution)

運用中に新しい列が現れたときの挙動は cloudFiles.schemaEvolutionMode で制御します。

モード新しい列が現れたときの挙動
addNewColumns(スキーマ推論時の既定)ストリームを一度停止してスキーマに新列を追加。再起動後は新列込みで処理が続く
rescueスキーマは変えず、新列のデータを rescued data column に退避して処理を続行
failOnNewColumnsストリームを失敗させる。人が確認してスキーマを更新するまで再開しない
none新列を無視する(データは捨てられる)

📝 試験のポイント

addNewColumns の「新列を検知するとストリームがいったん停止し、再起動後に新列が反映される」という挙動は問われやすい細部です。Lakeflow Jobs 上で実行していればジョブのリトライ設定により自動的に再起動され、運用は途切れません。また rescued data column(既定の列名 _rescued_data)は「スキーマに合わなかったデータを捨てずに JSON として退避する列」で、型不一致や新列のデータ救済に使われます。

2-3. スキーマ強制(schema enforcement)との関係

書き込み先の Delta テーブルにはスキーマ強制が働きます。テーブルのスキーマに合わないデータは書き込み時に拒否されるのが原則です(第3章で詳述)。Auto Loader は「読み取り側でスキーマを推論・進化させ、合わないデータは rescued data column に退避する」ことで、スキーマ強制と共存しながらデータを失わずに取り込みます。スキーマを固定したい場合は .schema(...) で明示指定すれば、推論を行わないスキーマ強制的な運用もできます。

3. ファイル検出モード:directory listing と file notification

「新しいファイルが来たことをどう知るか」には2つのモードがあります。

観点directory listing(既定)file notification
検出方法ディレクトリを一覧(リスト)して新ファイルを見つけるクラウドのイベント通知サービス(キュー)経由でファイル到着の通知を受け取る
セットアップ追加設定不要で簡単。ストレージへの読み取り権限だけで動く通知・キューのリソース設定が必要(自動セットアップ機能あり)。クラウド側の追加権限が要る
得意な規模小〜中規模のディレクトリ大規模(ファイル数が非常に多い、または高頻度で到着する)ディレクトリでも検出コストが増えにくい
指定方法既定(指定不要)推奨:cloudFiles.useManagedFileEvents = true(旧方式:cloudFiles.useNotifications = true)

directory listing はリストのコストがファイル数に比例して増えるため、ディレクトリが巨大になるほど不利になります。file notification は通知ベースなので検出コストが到着ファイル数にしか依存せず、大規模・高頻度のワークロードに向きます。

file notification モードには新旧2つの方式がある点に注意してください。現在の推奨は、Unity Catalog の外部ロケーションでファイルイベント(file events)を有効化したうえで cloudFiles.useManagedFileEvents = true を指定する managed file events 方式です。通知・キューのリソースを Databricks 側が管理するため、ストリームごとにクラウドリソースを個別作成する必要がありません。cloudFiles.useNotifications = true でストリームごとに通知リソースを構成する旧方式(レガシー)も引き続き利用可能ですが、新規構築では managed file events が推奨です。

4. バッチ的運用:trigger(availableNow=True)

Auto Loader は常時稼働のストリーミングだけでなく、バッチ的な定期実行にも使えます。trigger(availableNow=True) を指定すると、「起動した時点で未処理のファイルをすべて処理し、終わったら自動停止する」動きになります。

クラウドストレージに新ファイル到着S3 / ADLS / GCS
directory listing または file notification で検出
Auto Loader(cloudFiles)チェックポイントと照合し未処理ファイルだけ読む
スキーマ推論・進化/合わないデータは _rescued_data へ
Structured Streaming で処理常時稼働 または availableNow の定期実行
UC 管理 Delta テーブルexactly-once で追記

図:Auto Loader による増分取り込みの全体像

5. COPY INTO との使い分け

2-2 の比較表を判断基準の形でまとめ直します。

📝 試験のポイント

迷ったら「大規模・継続的・スキーマ進化 → Auto Loader」と覚えてください。逆方向の「小規模・SQL・単純バッチ → COPY INTO」とセットで、どちらの言い回しで問われても答えられるようにしておきましょう。

✅ この節のまとめ

練習問題

問1. Auto Loader が「一度処理したファイルを二度処理しない」ことを実現している仕組みはどれか。

  1. 処理済みファイルをストレージから自動削除する
  2. チェックポイントに処理済みファイルの情報を記録し、実行時に照合する
  3. ターゲットテーブルの全行と突き合わせて重複を除外する
  4. ファイル名に処理済みを示す接頭辞を自動で付け替える
解答と解説を見る

正解:B

Auto Loader は checkpointLocation に処理済みファイルの情報を永続化し、障害からの再開時も含めて exactly-once を保証します。Aのようにソースファイルを削除・変更することはありません(Dも同様に誤り)。Cのような全行照合は行っておらず、ファイル単位の記録で増分性を実現しています。

問2. スキーマ進化モードが既定の addNewColumns のとき、ソースデータに新しい列が現れた。Auto Loader ストリームの挙動として正しいものはどれか。

  1. 新しい列のデータは黙って破棄され、ストリームは何事もなく続行する
  2. ストリームはいったん停止し、スキーマに新列が追加され、再起動後は新列込みで処理される
  3. ストリームは永久に失敗し、テーブルを再作成するまで復旧できない
  4. 新しい列は自動的に文字列型として既存の列にマージされる
解答と解説を見る

正解:B

addNewColumns では、新列の検知時にストリームが UnknownFieldException で停止し、保存済みスキーマに新列が追記されます。再起動後は更新済みスキーマで処理が続くため、Lakeflow Jobs のリトライと組み合わせれば運用は自動で回復します。Aは none モード、データを退避しつつ続行するのは rescue モードの挙動です。Cは誤りで、再起動すれば復旧します。Dのような列のマージは行われません。

問3. 1時間あたり数万ファイルが到着する大規模なランディングディレクトリを Auto Loader で取り込むと、ファイル検出のコストと遅延が問題になってきた。最も適切な対策はどれか。

  1. cloudFiles.useNotifications = true を設定し、file notification モードに切り替える
  2. COPY INTO に切り替える
  3. checkpointLocation を削除して検出履歴をリセットする
  4. trigger(availableNow=True) を外して常時稼働にする
解答と解説を見る

正解:A

directory listing はディレクトリ内のファイル数に比例してリスティングのコストが増えます。file notification モードならクラウドのイベント通知で到着を知るため、大規模・高頻度でも検出コストが増えにくくなります(なお現在の推奨は、外部ロケーションでファイルイベントを有効化して cloudFiles.useManagedFileEvents = true を使う managed file events 方式で、useNotifications は旧方式です)。Bは逆方向で、COPY INTO はこの規模には向きません。Cはチェックポイントの削除により全ファイルの再処理(重複)を招く危険な操作です。Dは実行スタイルの変更にすぎず、検出方式のコスト構造は変わりません。

問4. Auto Loader のパイプラインを「1日1回、その時点までの未処理ファイルを処理したら停止する」形で動かし、クラスタの常時稼働コストを避けたい。正しい設定はどれか。

  1. trigger(processingTime="24 hours") を指定して常時稼働させる
  2. trigger(availableNow=True) を指定し、Lakeflow Jobs で日次スケジュール実行する
  3. Auto Loader はストリーミング専用なので、日次実行には使えない
  4. チェックポイントを無効化してバッチモードに変換する
解答と解説を見る

正解:B

availableNow=True は「未処理分をすべて処理して自動停止する」トリガーで、Lakeflow Jobs のスケジュールと組み合わせると常時稼働なしの増分バッチになります。Aは24時間間隔で動くもののストリーム自体は稼働し続けるため、コスト回避の要件に合いません。Cは誤りで、Auto Loader はバッチ的運用が公式にサポートされた使い方です。Dは誤りで、チェックポイントは増分性の要であり無効化できません。