Data Engineer Associate — 第 16 章
この章で学ぶこと
この章に出てくる用語
取り込みの設計で最初に迷うのは「どの仕組みで運ぶか」です。いきなり Structured Streaming を自分で書くと、認証・リトライ・スキーマ進化・API のレート制限まで全部を自前で面倒みることになります。ドキュメントが示す進め方は逆で、最もマネージドな層から始め、その層が要件を満たさないときだけ下の層へ降りるというものです。試験ではこの順序そのものが問われます。
| 層 | 代表例 | 自動化される範囲 | 下へ降りる理由 |
|---|---|---|---|
| マネージドコネクタ | Salesforce / Workday / SQL Server / MySQL / PostgreSQL | ソース固有の認証、CDC、リトライ、スキーマ進化 | ソースが未対応 |
| 標準コネクタ | Auto Loader (`cloudFiles`)、Kafka / Kinesis / Pub/Sub | 増分検出、チェックポイント、スキーマ推論 | 宣言的な依存管理や品質チェックが欲しい |
| Lakeflow パイプライン | ストリーミングテーブル、マテリアライズドビュー | 依存解決、増分更新、Expectations、監視 | 枠の外に出る細かい制御が要る |
| Structured Streaming | `readStream` / `writeStream` | 耐障害性と exactly-once の保証だけ | これ以上は降りられない |
マネージドコネクタが作る宛先はストリーミングテーブル、つまり増分処理に対応した Delta テーブルです。外部表でも一時ビューでもありません。SaaS ソースの構成は「接続 + 取り込みパイプライン + 宛先ストリーミングテーブル」の 3 要素で、データベースの CDC ではここに取り込みゲートウェイとステージング用の Unity Catalog ボリュームが加わります。ゲートウェイはソース側の変更ログが切り詰められる前に変更を捕まえる必要があるため継続的に稼働し、取り込みパイプラインがアイドルでも課金が発生します。列の増減は既定で自動的に扱われ、ソースで消えた列は宛先から物理削除されずに非アクティブになります。
| 比較軸 | COPY INTO | Auto Loader |
|---|---|---|
| 実行モデル | SQL のバッチコマンド | Structured Streaming のソース |
| 重複防止の仕組み | 取り込み済みファイル名をテーブルのメタデータに記録 | チェックポイント内の RocksDB で検出済みファイルを追跡 |
| ターゲット表 | 事前に存在している必要がある | ストリームの書き込み先として作れる |
| 規模 | 数千件規模の定期ロード向き | 数百万件でも通知モードなら一定コスト |
| 同時実行 | 入力ファイル集合が互いに素なら並行できる | チェックポイント単位で 1 本 |
| SQL だけで拡張したいとき | `CREATE STREAMING TABLE` と `read_files` が推奨代替 | ストリーミングテーブルの裏側で動く本体 |
ディレクトリリスティングは既定のモードで、LIST API を毎回叩くためファイル数に比例して検出コストとレイテンシが増えます。ファイル通知モードはクラウドのオブジェクト作成イベントを購読するため、数百万ファイルでもコストがほぼ一定です。ただしクラウド側はイベントの 100% 配信を保証しないので、欠損が許されない要件では `cloudFiles.backfillInterval` を設定して定期バックフィルを併用します。検出モードはストリームの再起動をまたいで切り替えられ、その際も exactly-once は維持されます。読み取り元の外部ロケーションには `READ FILES` 権限が必要で、Unity Catalog の外部ロケーションでファイルイベントを有効にしておくと、ストリーム設定時に追加の権限付与が不要になります。
この 4 つは必ず上から順に当てます。件数から入ると Salesforce のような SaaS ソースにまで Auto Loader を当ててしまい、レイテンシから入ると常時稼働のストリームばかり増えます。設問も「ソースは何か」「どれくらいの規模か」の順で情報を出してくるので、読む順番と判断の順番を揃えると迷いが減ります。
確認 — 穴あけ 3 問
0 / 3
空欄を押すと選択肢が出ます。間違えても減点はありません。
ドキュメントは取り込み方式を選ぶとき、最も な層から始め、要件を満たさなければ下の層へ降りることを推奨しています。
COPY INTO で取り込み済みのファイルを強制的に再ロードするには、COPY_OPTIONS の を true にします。
数百万ファイル規模で LIST API のコストを避けるには、Auto Loader を モードで動かします。
直前期にやるべきことは、新しい知識を足すことではありません。自分が落とした問題を、公式セクションのどこに属するかで束ねることです。演習カテゴリ ID は公式セクション名を英小文字のスラッグにしたもので、模試の結果画面に出る ID を控えれば読み直すべき章が絞れます。
| 公式セクション | 戻る章 | 演習カテゴリ ID | 落としたときの典型症状 |
|---|---|---|---|
| Databricks Intelligence Platform | 第 1〜3 章 | `databricks-intelligence-platform` | Single Node とジョブコンピュートの使い分けが出てこない |
| Data Ingestion and Loading | 第 4〜6 章 | `data-ingestion-and-loading` | `COPY INTO` と Auto Loader の役割を逆に覚えている |
| Data Transformation and Modeling | 第 7〜9 章 | `data-transformation-and-modeling` | Expectations の 3 アクションと Delta の DDL 制約が混ざる |
| Working with Lakeflow Jobs | 第 10〜11 章 | `working-with-lakeflow-jobs` | Run if の 6 条件と、条件未達時の状態名が出てこない |
| Implementing CI/CD | 第 12〜13 章 | `implementing-ci-cd` | `databricks.yml` のキーと CLI のサブコマンドが混ざる |
| Troubleshooting, Monitoring, and Optimization | 第 14 章 | `troubleshooting-monitoring-and-optimization` | VACUUM の既定値や統計を取る列数など、数値だけが抜ける |
| Governance and Security | 第 15 章 | `governance-and-security` | 行フィルタと列マスクの構文が入れ替わる |
本書が分析した DEA の実問題 850 問を「何を答えさせているか」で分類すると、次のようになりました。
| 問われ方 | 割合 | 典型的な問い |
|---|---|---|
| 概念 | 15.5% | メダリオンの Silver 層の役割はどれか |
| 仕組み | 33.6% | Auto Loader が同じファイルを二度処理しないのはなぜか |
| 操作・構文 | 30.9% | 行フィルタを外す ALTER 文はどれか |
| 設定値の暗記 | 20.0% | VACUUM の既定の保持期間は何時間か |
操作・構文と設定値の暗記だけで 50.9% を占めます。直前期の投資先は、次の第 3 節にまとめた数値と構文です。概念問題は落としにくく伸びしろも小さいので後回しで構いません。
ただし 1 つの設問が複数のセクションにまたがることがあります。「Auto Loader を実行するユーザーに必要な権限」は取り込みに見えて、答えは外部ロケーションへの `READ FILES` というガバナンスの知識です。カテゴリ ID は入口にすぎません。なお受験料や申込方法といった受験情報は本書では扱わず、演習アプリ側の解説記事と無料問題集に置いています。
確認 — 穴あけ 3 問
0 / 3
空欄を押すと選択肢が出ます。間違えても減点はありません。
本書が分析した DEA の実問題 850 問の分類では、操作・構文と設定値の暗記を合わせて全体の約 を占めます。
Auto Loader と COPY INTO を扱う章は、公式セクションの に対応します。
VACUUM や Liquid Clustering の数値は、公式セクションでは に分類されます。
この節は暗記用です。前日に上から指でなぞってください。2 周目は右の欄を隠し、値だけで症状を言えるか試します。数値そのものより、数値と症状の結びつきが問われます。
| オプション | 既定値 | 知らないと起きること |
|---|---|---|
| `cloudFiles.maxFilesPerTrigger` | 1000 | バックログ消化のバッチ数を見誤る |
| `cloudFiles.maxBytesPerTrigger` | 既定なし | 大きいファイルで 1 バッチが肥大化 |
| `cloudFiles.inferColumnTypes` | false | JSON / CSV の全列が文字列になる |
| `cloudFiles.includeExistingFiles` | true | 既存の大量ファイルを全部取り込む |
| `cloudFiles.allowOverwrites` | false | 上書きされたファイルが反映されない |
| `cloudFiles.validateOptions` | true | 綴り違いで起動に失敗 |
| `cloudFiles.schemaEvolutionMode` | addNewColumns | 新列で停止する理由が分からない |
スキーマ推論のサンプリングは最初に検出した 50 GB または 1000 ファイルのうち先に達した方までです。`schemaEvolutionMode` は `addNewColumns` / `addNewColumnsWithTypeWidening` / `rescue` / `failOnNewColumns` / `none` の 5 種類で、古い教材は先頭を除く 4 種類としています。int から long のような型の拡張まで許すのは 2 番目だけです。既定の `addNewColumns` は新列で `UnknownFieldException` を投げて止まり、再起動すると続きから取り込みます。スキーマに合わない値は `rescuedDataColumn`(既定名 `_rescued_data`)へ JSON で退避されます。`cloudFiles.schemaLocation` は推論を使うなら必須です。
COPY INTO target_table
FROM ( SELECT CAST(c1 AS DECIMAL(10,2)), c2 FROM 's3://bucket/path' )
FILEFORMAT = CSV
FORMAT_OPTIONS ('header' = 'true', 'multiLine' = 'true')
COPY_OPTIONS ('mergeSchema' = 'true')| 項目 | 値 | 知らないと起きること |
|---|---|---|
| VACUUM の既定保持期間 | 7 日 = 168 時間 | `RETAIN 1 HOURS` が例外になる |
| 安全機構の解除 | `spark.databricks.delta.retentionDurationCheck.enabled = false` | 短縮できないと思う |
| ログの既定保持期間 | 30 日 (`delta.logRetentionDuration`) | タイムトラベル範囲を誤る |
| 統計を取る列数 | 先頭 32 列 (`delta.dataSkippingNumIndexedCols`) | 33 列目では効かない |
| Liquid Clustering のキー | 最大 4 列 | 5 列目を足して失敗する |
| Liquid Clustering の一般提供 | Databricks Runtime 15.4 LTS 以上 | 版の下限を答えられない |
| 自動 Liquid Clustering | 15.4 LTS 以上 + Unity Catalog マネージドテーブル + 予測的最適化 | 外部表で有効化しようとする |
| 他レイアウトとの関係 | パーティショニング・ZORDER と併用不可 | 移行手順を誤る |
版の下限は出題時期で揺れます。現行ドキュメントは一般提供を 15.4 LTS 以上としますが、プレビュー時代の 13.3 LTS 以上を正解とする設問も残っています。
RESTORE TABLE sales TO VERSION AS OF 5;
SELECT * FROM sales TIMESTAMP AS OF '2026-01-01T00:00:00';
ALTER TABLE sales CLUSTER BY (region, order_date);
CONVERT TO DELTA parquet.`/mnt/raw/sales`;Change Data Feed はテーブル側で `delta.enableChangeDataFeed = true`、読み取り側で `readChangeFeed` と `startingVersion` を指定します。記録は有効化したあとの書き込みからで、遡れません。付与される列は `_change_type` / `_commit_version` / `_commit_timestamp` の 3 つで、SQL では `table_changes('sales', 5)` を使います。
| 項目 | 値または構文 |
|---|---|
| `outputMode` | `append` / `update` / `complete` の 3 つ |
| ウォーターマークなしの集約 + `append` | 起動時に `AnalysisException` |
| ウォーターマークの宣言 | `withWatermark("event_time", "10 minutes")` |
| `checkpointLocation` 未指定の `writeStream` | 起動時に `AnalysisException` で失敗 |
| Expectations の違反時アクション | 警告のみ / `ON VIOLATION DROP ROW` / `ON VIOLATION FAIL UPDATE` |
| ストリーミングテーブルとマテリアライズドビュー | 前者は増分追記、後者(旧 LIVE TABLE)は再計算 |
| 生成列 | `event_date DATE GENERATED ALWAYS AS (CAST(event_ts AS DATE))` |
| `MERGE INTO` の前提 | ターゲットが Delta。1 ターゲット行に複数ソース行が一致すると例外 |
`complete` は毎バッチ全集約を書き出すためファイルシンクでは使えず、`update` はバッチ writer には存在しません。
| 項目 | 値 |
|---|---|
| 1 ジョブのタスク数 | 最大 1,000 (100 超は新しい CLI/SDK が要る) |
| ワークスペースの同時タスク実行 | 2,000 |
| Run job / For each の親タスクの同時実行 | 750 (2,000 とは別枠) |
| Maximum concurrent runs の既定 | 1 |
| キューイング | 既定で有効、最大 48 時間待機 |
| タスク値の JSON サイズ | 48 KiB |
| For each の Concurrency の既定 | 1 |
| For each の Inputs | 直接記述は 5,000 文字、タスク値参照なら 48 KiB |
| Run Job タスクの入れ子 | 3 段を超える入れ子は非対応。循環依存も不可 |
| SQL タスクのコンピュート | サーバーレスまたは Pro の SQL ウェアハウス (Classic 不可) |
| ノートブック出力 | 全セル合計 30 MB、単一セル 8 MB |
| リトライの設定名 | `max_retries` / `min_retry_interval_millis` / `retry_on_timeout` |
`Run if` は 6 種類です。`All succeeded`(既定)/ `At least one succeeded` / `None failed` / `All done` / `At least one failed` / `All failed`。狙われるのは条件が満たされなかったときの状態です。上の並びで成功系の 3 つが未達なら `Upstream failed`、失敗系の 2 つが未達なら `Excluded` になります。`All done` は上流の結果によらず必ず実行されます。
dbutils.jobs.taskValues.set(key="record_count", value=1500)
# 下流タスクのパラメータ欄: {{tasks.count_rows.values.record_count}}
# For each のネストタスク内では {{input}} / {{input.region}}If/else 条件タスクでは `==` と `!=` が文字列比較なので `12.0 == 12` は false ですが、`>=` などは数値比較なので `12.0 >= 12` は true です。必須フィールドは `left` / `op` / `right` の 3 つです。
| 項目 | 値または構文 |
|---|---|
| 構成ファイル | `databricks.yml`(旧 `bundle.yml`) |
| 主なトップレベルキー | `bundle` / `variables` / `resources` / `targets` / `include` / `workspace` |
| 環境差分 | `targets` 配下で `variables` と `resources` を上書きし `-t prod` で切り替える |
| 構造化した値 | 変数定義に `type: complex` を書く |
| 既存オブジェクトの ID 解決 | 変数定義に `lookup:` を書き `cluster:` に名前を指定する |
| 変数値の解決順序 | `--var` → `BUNDLE_VAR_` 環境変数 → `variable-overrides.json` → `targets` の変数 → `default` |
| `mode: production` の検証 | パイプラインがすべて `development: false` か、Git ブランチがターゲット指定と一致するか |
| 主なコマンド | `bundle validate` / `bundle deploy` / `bundle run <key> -t prod` / `bundle generate job` |
| 操作 | 構文または要件 |
|---|---|
| 行フィルタの付与と解除 | `ALTER TABLE t SET ROW FILTER fn ON (col)` / `DROP ROW FILTER`(列は書かない) |
| 列マスクの付与と解除 | `ALTER TABLE t ALTER COLUMN c SET MASK fn` / `DROP MASK` |
| DENY | Unity Catalog では未サポート。`hive_metastore` 配下のみ |
| ジョブ監視 | `system.lakeflow.jobs` と `job_run_timeline`。コストは `system.billing.usage` と結合 |
| init script の保存先 | Unity Catalog ボリュームまたはワークスペースファイル (DBFS は非推奨) |
| Single Node | ドライバのみ。pandas や小規模 ML 向け |
| プールとオートスケール | プール優先で割り当て、不足分だけ新規 VM を起動 |
| ローカル SSD と EBS | 前者は高 IOPS で揮発、後者は低速で永続 |
確認 — 穴あけ 3 問
0 / 3
空欄を押すと選択肢が出ます。間違えても減点はありません。
cloudFiles.maxFilesPerTrigger の既定値は ファイルです。
VACUUM を引数なしで実行したときの既定の保持期間は 時間です。
バンドル構成の記述が正しいかをデプロイ前に確認するコマンドは databricks bundle です。
知識はあるのに 4 択で外す状態には原因があります。誤答の選択肢は数種類の型を使い回して作られており、型を覚えれば知識があいまいでも選択肢を 2 つまで絞れます。
最も多い型です。もっともらしい英単語を組み合わせた、実在しない名前が並びます。知らない名前は「まだ習っていない機能」ではなく「捏造」を先に疑ってください。Auto Loader のオプションは必ず `cloudFiles.` で始まりますが、プレフィックスが正しいことは実在を意味しません。`cloudFiles.onViolation` は存在せず、`ON VIOLATION` は Expectations 側のキーワードです。
| 捏造されがちな名前 | 実在する正しい名前 |
|---|---|
| `enableCDF` / `changeDataFeed` / `fromVersion` | `readChangeFeed` と `startingVersion` |
| `COMPUTED FROM` / `VIRTUAL AS` | `GENERATED ALWAYS AS (式)` |
| `MASKED BY` / テーブル単位の `WITH MASK` | 列定義の直後に書く `MASK 関数名` |
| `retry_count` / `backoff_factor` | `max_retries` と `min_retry_interval_millis` |
| If/else の単一 `expression` フィールド | `left` / `op` / `right` の 3 つ |
| `%git` マジックコマンド | Git UI、Databricks CLI、Repos REST API |
| `databricks bundle test` / `bundle check` | `databricks bundle validate` |
| `dbutils.lineage.start()` | リネージは Unity Catalog が自動収集する |
| `dbutils.jobs.taskValues.emit()` | `.set()` と `.get()` |
型 1 の裏返しで、実在する機能を「そんな構文はない」と切る失点です。`DENY` は Databricks SQL に実在しますが、Unity Catalog では非対応で `hive_metastore` 配下にのみ適用されます。捏造だと決めつけると、正解が「Unity Catalog では未サポート」だったときに落とします。切るときは「無い」のか「あるが対象外」なのかを言葉にします。
実在する 2 つの入れ物のうち、間違った方に正しいオプションを入れて見せる型です。名前は正しいので、うろ覚えだと引っかかります。
2 つの機能の説明文を丸ごと交換してある型です。ペアで覚えているものほど弱いので、どちらがどちらかを一言で言えるようにしておきます。
正しい数値の周辺に、それらしい別の数値を置く型です。24 時間・168 時間・30 日、100・1,000・2,000 のように、同じ単位で別の正解になり得る数値が混ざります。ここは推理が効かないので、第 3 節の表を数字だけ縦読みして覚えてください。とくに `VACUUM` の 168 時間と `logRetentionDuration` の 30 日は取り違えを誘われます。あわせて「常に」「必ず」「一切」「唯一」が入った記述は疑ってかかります。ただし例外もあります。「For each タスクを入れ子にすることはできない」のように、仕様として本当に例外がない文はそのまま正解になります。限定語は「疑うためのフラグ」であって「消すためのフラグ」ではありません。
「2 つ選んでください」の問題は、正解が1 本の軸の両端になっていることが多いという性質があります。Auto Loader のスキーマ進化なら「新しい列を取り込む設定」と「型が合わない値を救う設定」で 1 組です。
排他関係を知っていると一気に絞れる論点があります。Liquid Clustering とパーティショニングは同一テーブルで併用できません。For each タスクは入れ子にできず、Run Job タスクは 3 段を超えて入れ子にできません。行フィルタはテーブル属性であって権限ではないため、`REVOKE ROW FILTER` のような構文は存在しません。「両方できます」と書かれた選択肢は、排他関係の知識で落とせることが多いのが DEA の特徴です。
決められないときはより狭く具体的な記述を選びます。「Photon は SQL と DataFrame の演算を高速化する」と「Photon はすべてのワークロードを高速化する」なら前者が正解です。Python UDF のように JVM と Python をまたぐ処理では効果が限定的だからです。反転設問にも注意します。「誤っているものを選んでください」では正しい説明が 3 つ並ぶので、設問文の末尾を読んでから選択肢に入る順番を固定します。
DEA は 45 問を 90 分で解くため、1 問あたりの平均は 2 分です。5 つの型は数秒で判定できます。捏造名を消し、名前空間を確かめ、極端な限定語を疑うところまでを機械的に済ませ、残った選択肢だけに時間を使います。1 分で決まらない問題は印を付けて先へ進みます。全問を一巡してから戻るほうが確実に点が伸びます。復習では解説の後半まで読みます。捏造オプションは「そのようなオプションは存在しない」と一言だけ書かれることが多く、そこを飛ばすと次も引っかかります。
確認 — 穴あけ 3 問
0 / 3
空欄を押すと選択肢が出ます。間違えても減点はありません。
Change Data Feed を読むときの読み取り側オプションは で、似た名前の enableCDF は存在しません。
COPY INTO で header や multiLine を渡す先は です。
「常に」「必ず」「一切」のような を含む記述は、まず疑ってから真偽を確かめます。
この章のまとめ
この端末にだけ保存されます(登録不要)
この章の根拠
最終確認 2026-08-09 / 対応バージョン DEA 2026-05-04 改訂版
コース全体