Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Databricks Free Editionで始めるLakeflow SDP

Databricks Free Editionで始めるLakeflow SDP

こちらのもくもく会の資料です。

Databricks無料版で始めるLakeflow SDPもくもく会
https://jedai.connpass.com/event/379329/

Avatar for Takaaki Yayoi

Takaaki Yayoi

January 13, 2026
Tweet

More Decks by Takaaki Yayoi

Other Decks in Technology

Transcript

  1. ©2026 Databricks Inc. — All rights reserved 自己紹介 弥生 隆明

    (やよい たかあき) シニア スペシャリスト ソリューションアーキテクト ▪ 2020年からデータブリックス ジャパンにお いて、プレセールス、POCに従事 ▪ 生成AI、データエンジニアリング、 アプリが専門領域です。 ▪ 前職はコンサル、総合電機メーカー にてデータ分析・Webサービス構築 などに従事。インド赴任経験あり。 ▪ Databricks Certified (Data Engineer | Machine Learning) Professional, Generative AI Engineer Associate ▪ Qiitaでいろいろ書いています。 3 @taka_aki
  2. ETL処理の実装アプローチ 8 ETL処理を実装する方法は大きく2つあります 命令型(PySpark) 「どうやって処理するか」をステップバイステップで記述 df = spark.read.csv(...) df =

    df.filter(...) df.write.saveAsTable(...) ✓ 柔軟性が高い ✓ デバッグしやすい △ コード量が多い △ 運用が大変 宣言型(Lakeflow SDP) 「何が欲しいか」を宣言し、実行方法はシステムにお任せ @dp.table def silver_data(): return dp.read("bronze") ✓ 簡潔 ✓ 自動で依存関係解決 △ 細かい制御が難しい 今回は宣言型にフォーカスします
  3. 統合 単一のソリューション 合理化 シンプルなETL開発 効率的 インクリメンタルバッチ、ストリーム Lakeflow 取り込み 変換 オーケストレート

    クラウド ストレージ メッセージキュー データ ベース 企業 アプリケーション データインテリジェンス プラットフォーム データウェアハ ウス ビジネスインテ リジェンス AI / ML データ共有 Lakeflowはすべて の人にとっての データエンジニアリ ングの未来です 15
  4. Lakeflow Spark宣言型パイプラインとは ? ETL処理のためのモダンなソフトウェアエンジニアリング Lakeflow SDPは、シンプルな宣言型アプローチ を使用して信頼性の高いデータパイプラインを構築す る、初のETLフレームワークです。Lakeflow SDPはインフラストラクチャを大規模に自動管理 するた

    め、データアナリストやエンジニアはツールに費やす時間を削減し、データから価値を引き出すこと に集 中できます。 ETL開発を加速 インフラストラクチャを 自動管理 データへの 信頼を確保 バッチと ストリーミングを 簡素化 https://www.databricks.com/jp/product/data-engineering/spark-declarative-pipelines 18
  5. 宣言型パイプラインによるプログラミング どう行うかではなく、何を行うべきかを記述 宣言型パイプラインプログラム def upsertToDelta(microBatchOutputDF: DataFrame, batchId: Long) { microBatchOutputDF

    .groupBy("key") .agg(max_by("ts", struct("*").alias("row")) .select("row.*") .createOrReplaceTempView("updates") microBatchOutputDF.sparkSession.sql(s""" MERGE INTO cdc_data_raw t USING updates s ON s.key = t.key WHEN MATCHED AND s.is_delete THEN UPDATE SET DELETED_AT=now() WHEN MATCHED THEN UPDATE SET A=CASE WHEN s.ts > t.ts THEN s.a ELSE t.a, B=CASE WHEN s.ts > t.ts THEN s.b ELSE t.b, … for every column … WHEN NOT MATCHED THEN INSERT * """) } cdcData.writeStream .foreachBatch(upsertToDelta _) .outputMode("append") .start() AUTO CDC INTO cdc_data FROM source_data KEYS (id) SEQUENCE BY ts APPLY AS DELETE WHEN is_deleted Spark命令型プログラム 19
  6. 例:ECサイトの注文データ( 1年分 = 1億件) フルリフレッシュ 毎日1億件を処理 3時間 コスト: 高い💸 インクリメンタル

    今日の新規10万件だけ 2分 コスト: 低い💰 ⏱ 処理時間の短縮 90倍高速化も可能 💰 コスト削減 クラウド費用を大幅カット 🔄 更新頻度UP 日次→時次→リアルタイム なぜインクリメンタル処理が重要なのか? 22 毎日のデータ更新を例に考えてみましょう
  7. 😰 命令型で自分で実装する場合 「どこまで処理したか」を記録する仕組みが必要 途中で失敗したらどこからやり直す? 重複処理を防ぐロジックも必要 テーブルごとに実装が必要で大変 ... 😊 Lakeflow SDPなら

    進捗管理は自動でやってくれる 失敗時のリカバリも自動 重複排除も組み込み済み 宣言するだけで自動的に差分処理! Lakeflow SDPがインクリメンタル処理 を簡単にしてくれる インクリメンタル処理の実装は難しい? 23 自分で実装しようとすると、こんな問題が...
  8. テーブル データを物理的に保存 📦 ✅ クエリが速い ✅ データが永続化される ビュー クエリの「定義」だけ保存 📝

    ✅ ストレージ不要 ❌ クエリのたびに計算 前提確認:テーブルとビュー 24 一般的なデータベースの知識を確認
  9. 😓 差分処理が大変 毎日追加されるデータ → 毎回全件処理し直す? → 差分処理のコードは複雑 😓 順番の管理 Bronze

    → Silver → Gold → 依存関係の管理が面倒 → エラー時のリトライは? 😓 データ品質 不正データの混入 → チェック処理を自前実装 → 除外件数の記録は? テーブル保存は簡単。その周辺の管理が大変。 課題:普通のテーブルで何が困る? 25 PySparkの方法(df.write.saveAsTable)の問題点
  10. 命令型(Part 1) 「どうやって作るか」を全部書く df = spark.read.table("src") df = df.filter("fare >

    0") df.write.saveAsTable("tgt") + 差分処理 + エラー処理 + 品質チェック... → 宣言型(Part 2 / SDP) 「何が欲しいか」だけ宣言 @dp.materialized_view() def silver(): return dp.read("bronze") ✅ 差分・依存関係・品質管理を自動化 SDPは「面倒な周辺管理」を引き受けてくれる仕組み SDPの解決策:「宣言するだけ」 26
  11. 一般的な概念(Oracle、PostgreSQLなどにも存在):クエリ結果を保存したビュー 普通のビュー 📝 → 🔄 → 結果 クエリのたびに計算(遅い) マテリアライズドビュー 📦

    → 結果 保存済みを読むだけ(速い) SDPでの追加機能 ✅ パイプライン実行時に自動更新 ✅ 依存関係の自動解決 ✅ データ品質管理 マテリアライズドビュー( MV)とは 28
  12. Databricks固有の概念:Autoloaderでファイルを増分取り込みするためのテーブル 典型的な使い方:クラウドストレージからの取り込み @dp.table() def bronze_data(): return (spark.readStream .format("cloudFiles") # Autoloader

    .option("cloudFiles.format", "json") .load("/landing/zone/")) STのメリット 新しいファイルだけを処理(高速・低コスト) 主な用途 Bronze層でのデータ取り込み ストリーミングテーブル( ST)とは 29
  13. 典型的なパイプライン構成 Bronze ST ファイル取り込み → Silver → クレンジング ST Gold

    MV 集計 MVとSTの使い分け 30 • 典型的なパイプライン構成では、Bronze層とSilver層をSTで、Gold層をMVで作ります。 • STはファイルの取り込みだけでなく、フィルタリング、型変換、カラム追加といった 1行が1行になる処理であれば続けて使えます。 • 集計(groupBy)やJOINが必要になったタイミングでMVに切り替えます。これは、STが 「追加」しかできないのに対し、集計やJOINは既存の行を「更新」する必要があるためです。
  14. マテリアライズドビュー @dp.materialized_view() def my_table(): return spark.read... 変換・集計・JOINに使用 ストリーミングテーブル @dp.table() def

    my_table(): return spark.readStream... Autoloaderでの取り込みに使用 @dp.materialized_view() = MV / @dp.table() + readStream = ST コードの書き方 32 from pyspark import pipelines as dp
  15. すべてMVで実装します Bronze MV サンプルデータ読込 → Silver MV クレンジング → Gold

    MV 日別集計 なぜMVだけ? 今回は既存のサンプルデータ(samples.nyctaxi.trips)を使うため、 Autoloaderでのファイル取り込みは不要 → すべてMVでOK 今回の実習 33
  16. Lakeflowパイプラインエディタ 1. パイプラインアセットブラウザ 2. ステップバイステップの開発機能を備 えたマルチファイルコード エディタ • ソフトタブ •

    ガターアクション • インラインエラーインジケーター 3. インタラクティブDAG 4. データプレビュー 5. 実行インサイトパネル 1 2 3 4 5 35
  17. データ品質 エクスペクテーションの活用 • データエクスペクテーション により、パイプ ライン内でデータ品質と整 合性の制御を定義 • 柔軟なポリシーでデータ品 質エラーに対処:

    失敗、破 棄、アラート、 隔離(今後) • すべてのデータパイプ ライン実行と品質メトリクス が取得、追跡、報告されま す /* Stage 1: Bronze Table drop invalid rows */ CREATE STREAMING TABLE fire_account_bronze AS ( CONSTRAINT valid_account_open_dt EXPECT (acconut_dt is not null and (account_close_dt > account_open_dt)) ON VIOLATION DROP ROW COMMENT "Bronze table with valid account ids" SELECT * FROM fire_account_raw ... 36
  18. 開発と本番 迅速な反復開発またはエンタープライズグレードの信頼性 開発(Development)モード • 長時間稼働するクラスター を再利 用し、迅速な反復開発 を実現 • エラー時のリトライなし

    で、 より高速なデバッグ が可能 • エディタまたはオーサリングUI からトリガーされるパイプライン向け • 完了後すぐにクラスターをオフ にして コストを削減 (5分以内) • クラスターの再起動を含む エスカレーティングリトライ により、一時的な問題に対しても信頼 性を確保 • スケジュールされたパイプライン向け 本番(Production)モード 37
  19. データガバナンス • 行/列レベルの セキュリティ • 複数のスキーマへの 公開 • ストリーミング テーブルからの変更デー

    タフィード • Hive Metastoreの移行を サポート Unity Catalog連携 # fully qualified CREATE MATERIALIZED VIEW catalog.schema.name # partially qualified CREATE MATERIALIZED VIEW schema.name # single part name CREATE MATERIALIZED VIEW name from pyspark import pipelines as dp @dp.table def table_name(): @dp.table(name="schema.name") def func(): @dp.table(name="catalog.schema.name") def func(): 41
  20. Step 3: ファイル構成を確認 クローン後のフォルダ構成: 📁 data_engineering_course/ ├── 📄 README.md ├──

    📁 notebooks/ │ ├── 📓 exercise_part1_imperative.py │ └── 📓 exercise_part4_jobs.py └── 📁 pipelines/ ├── 📄 pipeline_basic.sql └── 📄 pipeline_with_expectations.sql 各ファイルの用途: 演習1: 命令型ETL notebooks/exercise_part1_imperative.py → ノートブックを開いて Run All 演習2-3: SDP パイプライン pipelines/*.sql(リファレンス用) → パイプラインエディタで入力 演習4: ジョブ設定 notebooks/exercise_part4_jobs.py → 参考資料(GUI操作中心) ✅ これで準備完了です。演習 2から始めましょう! 49
  21. 演習2-3を開始する(パイプライン作成) 1 新規 → ETL パイプライン を選択 2 パイプライン名を入力(例 :

    sdp_nyctaxi_pipeline) 3 カタログ=workspace / スキーマ=新規作成 4 空のファイルで開始、言語は SQL 5 エディタで SQL を入力して実行 📄 リファレンス : 完全なSQLは pipelines/pipeline_basic.sql を参照。演習3は pipeline_with_expectations.sql 50