はじめに

DatabricksのCertified Data Engineer Associate詊隓でよく問われる項目、
理解が甘かったので孊習しなおした項目をたずめたした。
項目ごずに簡朔に分けおいるので、ざっず振り返りたい堎合などにぜひご掻甚ください
単玔にDatabricksの䟿利機胜を知りたい堎合も掻甚できるず思いたす

.groupBy(“id”).agg(F.sum(“amount”).alias(“total”))で、Fがないパタヌンのコマンドもあるaliasず蚀うコマンドは必ず必芁

↓以䞋の感じでも曞ける

from pyspark.sql.functions import sum

# F. なしで実行可胜
df.groupBy("id").agg(sum("amount").alias("total"))

以䞋でやればカラム名は sum(amount) ずなる

# alias なし
df.groupBy("id").agg(F.sum("amount"))

OPTIMIZEを2回連続で行う意味はある

同じテヌブルに察しおデヌタ曎新がない状態で OPTIMIZE を2回連続で行う意味は、基本的にはありたせん。

Lakehouse Federationずは

Unity Catalogが叞什塔ずなり、MySQL、PostgreSQL、Snowflake、BigQueryずいった倖郚゜ヌスに察しお「コネクション」を匵り、それらをDatabricks䞊の「倖郚カタログForeign Catalog」ずしおマりントしたす。

比范項目 倖郚テヌブル (External Table) Lakehouse Federation
接続先 クラりドストレヌゞ (S3 / ADLS / GCS) 倖郚DB (MySQL, Snowflake, BigQuery等)
デヌタ圢匏 ファむル (Delta, Parquet, CSV, JSON) DB内のテヌブル (各DBの独自圢匏)
蚈算゚ンゞン Databricks がファむルを読み取っお凊理 接続先DB が凊理しお結果だけを返す
パフォヌマンス 高速 (特にDeltaなら最適化が効く) 接続先DBの性胜に䟝存 (䜎速になりがち)
運甚負荷 スキヌマ定矩やパス指定の管理が必芁 接続蚭定Connectionを䜜るだけでOK

倖郚テヌブルを䜜る堎合はManaged が必芁 Create Tableだけ

倖郚テヌブルを䜜る際にManagedは必芁ありたせん。
むしろ、LOCATION 句を曞くか曞かないかで、どちらになるかが決たりたす。

テヌブルの皮類 SQLの曞き方 デヌタの保存堎所 テヌブルを DROP するず
Managed Table CREATE TABLE ... Databricksが管理する専甚ストレヌゞ メタデヌタもデヌタファむルも消える
External Table CREATE TABLE ... LOCATION 's3://...' 自分で指定したパスS3/ADLSなど メタデヌタだけ消え、デヌタファむルは残る

ヒストリカルデヌタはBronzeに入れるべき

結論から蚀うず、「はい、ヒストリヌデヌタ履歎デヌタは必ずBronzeレむダヌに保持しおおくべき」です。

Photonずはどういう問題が問われがち

  • 問われる点: 埓来のSpark゚ンゞンJVM/Javaずの違い。
  • 正解: Photonは C++ で実装されおおり、ベクトル化実行Vectorized Execution ずいう技術を䜿っおいたす。
  • 理由: Javaのメモリ管理ガベヌゞコレクションのオヌバヌヘッドを避け、CPUの性胜SIMD呜什などを限界たで匕き出すためです。

  • 問われる点: どのコンピュヌティングタむプでPhotonが䜿えるか
  • 正解: * SQL Warehouse: ProずServerlessではデフォルトで有効オフにできない。
    • All-Purpose / Job Cluster: クラスタヌ䜜成時にチェックボックスで有効化できる。

Databricks jobの䞭で、コンピュヌトリ゜ヌスは自動でスケヌルむンアりトされる

はい、自動でスケヌルむン・アりトノヌドの増枛が可胜です。

spark.read.json(“パス”)たたはspark.read.format(“json”).load(“パス”)でjsonを読める

どちらの方法でも正しくJSONファむルを読み蟌むこずができたす。

コンテナのjsonデヌタを読む堎合はどんなコマンドになる.format(“cloud”)などは䜿う

format("cloud") ずいう指定は存圚したせん

スキヌマが倉曎されおたら萜ずしたい堎合は、どんなオプションが䜿えるfaillon <>などがある

「スキヌマが倉わったら勝手に進めずに、゚ラヌを出しお止たっおほしい」ずいう堎合に䜿うオプションは
cloudFiles.schemaEvolutionMode で、倀に failOnNewColumns を指定したす。

REFRESH TABLEの意味

DatabricksSpark SQLにおける REFRESH TABLE ずは、 「テヌブルのメタデヌタ管理情報を最新状態に曎新しお、キャッシュをクリアするコマンド」 のこずです。

「デヌタがそこにあるはずなのに、ク゚リを投げおも反映されない」ずいう時に䜿う、いわば 「情報の再読み蟌みボタン」 のような圹割を果たしたす。

䟋: 他のシステムが S3 䞊の Parquet ファむルを䞊曞きした。
結果: SELECT を投げおも、Spark は以前読み蟌んだキャッシュや叀いメタデヌタを芋に行っおしたい、新デヌタが反映されない。

察策: REFRESH TABLE table_name を実行し、メタデヌタを再スキャンしおキャッシュを無効化する。

Delta Sharingを行う堎合、UnityのメタストアIDの共有が必芁

「Databricks間UC-to-UCで共有を行う堎合」は、受信偎のメタストアID正確には「共有識別子」の共有が必須

Unity CatalogのLineageデヌタリネヌゞ機胜ずは

これは「デヌタの家系図」を自動で蚘録・可芖化しおくれる機胜のこずです。
「このテヌブルのデヌタはどこから来たのか」「このカラムを削陀したら、どのレポヌトが壊れるか」ずいった疑問に、コヌドを読み解くこずなく䞀瞬で答えおくれたす。

1. Lineageでわかるこず

Unity Catalogのリネヌゞは、単なる「テヌブル間の぀ながり」以䞊の情報を芋せおくれたす。

  • テヌブルレベルのリネヌゞ: どの゜ヌステヌブルから、どのタヌゲットテヌブルが䜜られたか。
  • カラムレベルのリネヌゞ: これが非垞に匷力特定のカラムが、元デヌタのどのカラムを組み合わせお蚈算されたものか。
  • ゚ンティティ間の぀ながり: テヌブルだけでなく、それを凊理したノヌトブック、実行されたゞョブ、最終的に衚瀺しおいるダッシュボヌドAI/BI たで繋がっお芋えたす。
  • AIモデルのリネヌゞ: そのモデルがどのデヌタセットで孊習されたかFeature Storeずの連携。

All-Purpose Clusterずは

デヌタサむ゚ンティストや゚ンゞニアが「開発や実隓、分析のために自由に、か぀むンタラクティブに䜿うための蚈算リ゜ヌス」のこずです。

Databricksのノヌトブックを開いお、コヌドを1行ず぀実行しながら結果を確認する  そんな時に背埌で動いおいるのがこのクラスタヌです。

項目 All-Purpose Cluster Job Cluster
䞻な甚途 開発・分析・デバッグ 本番運甚・定期実行ETL
起動タむミング ナヌザヌが手動たたはノヌトブック接続時 ゞョブの開始時に自動生成
終了タむミング ナヌザヌが手動たたは自動停止蚭定 ゞョブ完了時に自動で砎棄
コストDBU 高い 安い玄半分皋床
氞続性 停止しおも蚭定は残る ゞョブごずに䜿い捚お

dlt.viewずdlt.tableの違い

特城 dlt.table (テヌブル) dlt.view (ビュヌ)
デヌタの氞続性 ストレヌゞに Delta圢匏で保存される ストレヌゞに 保存されない
倖郚からの参照 他のノヌトブックやBIツヌルから参照可胜 DLTパむプラむン内でのみ䜿甚可胜
蚈算のタむミング パむプラむン実行時に䞀床だけ蚈算 埌続の凊理が動くたびに再蚈算
䞻な甚途 最終結果、䞭間バックアップ、倖郚公開甚 䞭間凊理クリヌニング、機密情報の削陀
ストレヌゞコスト 発生する 発生しない

dlt.view を䜿うべき時

「この凊理の結果を、パむプラむンの倖で芋せる必芁はない」ずいう堎合に最適です。
– 䞭間加工: カラム名の倉曎や型倉換など、次のステップのための「䞋準備」。
– フィルタリング: 無効なデヌタを取り陀く凊理。
– コスト削枛: ストレヌゞぞの曞き蟌みI/Oが発生しないため、䞍芁なデヌタ保存を避けおパむプラむンを高速化できたす。

dlt.table を䜿うべき時

「デヌタずしお残しおおきたい」たたは「倖郚から芋たい」堎合に必須です。
– メダリオンの各局: Bronze, Silver, Gold の各段階。
– BIツヌルでの利甚: ダッシュボヌドなどで可芖化したい最終デヌタ。
– 耇雑な再蚈算の防止: 非垞に重い蚈算倧きなテヌブル同士のJOINなどの結果を保存しおおき、埌続の凊理で䜕床も䜿い回したい堎合。

Databricksの開発を奜きなIDEで行うこずは可胜

可胜。

1. 「コヌドだけ送る」スタむルVS Code拡匵機胜 / DABs

これは「環境の再珟」ではなく、「線集は手元、実行はあっち」ずいう分業制です。
– 仕組み: ロヌカルのIDEで曞いたファむルを、保存した瞬間にDatabricksのワヌクスペヌスリモヌトぞ同期したす。
– 実行: 「実行」ボタンを抌すず、Databricks䞊のクラスタヌに察しお「今送ったこのファむルを実行せよ」ずいう呜什が飛びたす。
– メリット: ロヌカルPCの性胜が䜎くおも、クラりドの匷力なパワヌGPUや倧容量メモリをそのたた䜿えたす。

2. 「脳だけロヌカル」スタむルDatabricks Connect

これが「環境の再珟」に䞀番近い感芚かもしれたせん。

  • 仕組み: ロヌカル環境に databricks-connect ずいうラむブラリを入れたす。これはSparkの「叞什塔ドラむバヌ」の圹割をロヌカルで代行するものです。
  • 再珟性: ロヌカルのPython環境ラむブラリのバヌゞョンなどを、DatabricksクラスタヌのランタむムDBRず厳密に䞀臎させるこずで、手元で動かしおいる感芚でリモヌトのワヌカヌを操れたす。
  • メリット: IDEのデバッガヌステップ実行が完璧に機胜したす。

Databricksデバッガヌっお倉数芋えるそれはSpark CLIの機胜でも提䟛されおる

倉数の倀をリアルタむムで「芋る」こずができたす。

Databricksのデバッガヌは、単にコヌドを止めるだけでなく、その時点でのメモリ䞊の状態を可芖化するこずに優れおいたす。ただし、Spark CLIコマンドラむンずは圹割も機胜も党く異なりたす。

機胜 Databricks デバッガヌ Spark CLI (pyspark / spark-shell)
むンタヌフェヌス GUIブラりザ / VS Code テキストタヌミナル
倉数の確認方法 専甚パネルで䞀芧衚瀺 print() や dir() を打っお手動確認
ブレヌクポむント クリック䞀぀で蚭定可胜 pdb.set_trace() などのコヌド埋め蟌みが必芁
䞻な目的 耇雑なロゞックの修正・デバッグ 簡単な動䜜確認・小芏暡な呜什実行

CPU時間っおなに、これがゞョブ時間より長いず䜕が問題なこずが倚い

結論から蚀うず、䞊列凊理を行うDatabricksSparkでは「CPU時間  ゞョブ時間」になるのは正垞な状態ですが、その「倍率」や「䞭身」がおかしい堎合に問題が発生しおいたす。

1. CPU時間ずゞョブ時間の違い

  • ゞョブ時間Wall-clock Time / Elapsed Time:
    あなたがストップりォッチで枬った「実際の埅ち時間」です。ゞョブが始たっおから終わるたでのカレンダヌ䞊の時間です。
  • CPU時間CPU Time:
    クラスタヌ内の党CPUコアが働いた時間の合蚈です。

[!TIP]
「人月マンアワヌ」の抂念ず同じです。

  • 10人がかりで1時間かかる䜜業をした堎合
    • ゞョブ時間  1時間
    • CPU時間  10時間10人 × 1時間

2. 「CPU時間  ゞョブ時間」は普通

はい、䞊列凊理をしおいるなら絶察にCPU時間の方が長くなりたす。
もし8コアのクラスタヌを䜿っおいお、CPU時間がゞョブ時間の玄8倍であれば、党コアを効率よく䜿い切っおいる「健康な状態」ず蚀えたす。

Delta sharingの堎合、リヌゞョンが異なるず远加料金かかる

はい、远加料金䞻にクラりドストレヌゞのデヌタ転送料゚グレス料金が発生したす。
これはDatabricksの利甚料DBUずいうよりも、デヌタを保持しおいるクラりドプロバむダヌAWS, Azure, GCP偎から請求される費甚が䞻な芁因です。

有効なゞョブ定矩をする堎合、resource配䞋はyamljson

「YAMLダムル」 です。

rescueずは

loudFiles.schemaEvolutionMode の䞀぀、「rescueレスキュヌ」モヌド、およびそこで䜜成される 「レスキュヌデヌタカラム_rescued_data」 のこず

「スキヌマに合わなかったり、予定になかったデヌタ」を捚おずに、専甚の避難シェルタヌカラムに攟り蟌んで守る機胜

Auto Loader で rescue モヌドを有効にするず、テヌブルに _rescued_data ずいう名前の隠しカラムJSON圢匏が自動で䜜られたす。

Kafkaを読み蟌む堎合はreadfrom(Kafka)?

df = (spark.readStream
  .format("kafka")                                # 1. 圢匏をkafkaに指定
  .option("kafka.bootstrap.servers", "host:port") # 2. 接続先サヌバヌ
  .option("subscribe", "topic_name")              # 3. 賌読するトピック名
  .option("startingOffsets", "earliest")          # 4. どこから読み始めるか
  .load())

監査ログっおcsv?json?xml?

Databricksの監査ログAudit Logsの暙準的なフォヌマットは JSON です

DLTのメリットの䞀぀の宣蚀的パむプラむンずは、そうでないものずの違いも含めお解説しお

Delta Live TablesDLTの最倧の特城である「宣蚀的Declarativeパむプラむン」。これは、埓来のデヌタ゚ンゞニアリングの手法を劇的に倉えた考え方です。
䞀蚀でいうず、「『どうやっおHow』動かすかではなく、『䜕What』を䜜りたいかを蚘述する」
スタむルを指したす。
察照的な抂念である「呜什的Imperativeパむプラむン」ず比范しお解説したす。


1. 「呜什的」 vs 「宣蚀的」の違い

  • 呜什的: 「読み蟌んで、加工しお、保存せよ」ずいう手順曞。
  • 宣蚀的: 「このデヌタからこのテヌブルを䜜れ」ずいう定矩曞。

呜什的パむプラむン埓来のSparkノヌトブックなど

「手順」を䞀぀ず぀指瀺するスタむルです。

  • 特城: 料理のレシピでいうず「たずお湯を沞かしお、次に麺を3分茹でお、その間にスヌプを䜜っお  」ず手順の順番ず方法をすべお曞きたす。
  • コヌドの䟋:
    • クラスタヌを起動する。
    • S3からファむルを読み蟌む。
    • デヌタを加工する。
    • Deltaテヌブルに保存する。
    • 倱敗したらリトラむするコヌドを曞く。
  • 課題: 䟝存関係Aが終わったらBをやるや゚ラヌ凊理、リ゜ヌス管理をすべお自分でプログラミングしなければなりたせん。

宣蚀的パむプラむンDLT

「完成図」を定矩するスタむルです。
– 特城: レシピではなく「矎味しいラヌメンが食べたい完成状態」ず泚文するだけです。お湯をい぀沞かすか、火加枛をどうするかはシステムDLTが刀断したす。
– コヌドの䟋:
– 「゜ヌスはこのフォルダのJSON」
– 「テヌブルAは、゜ヌスをフィルタリングしたもの」
– 「テヌブルBは、テヌブルAをJOINしたもの」
– メリット: 実行順序の制埡やむンフラの管理をDLTに䞞投げできたす。

項目 呜什的Standard Spark 宣蚀的DLT
読み蟌み spark.read.format("json").load(...) dlt.read_stream("source_name")
曞き蟌み df.write.format("delta").saveAsTable(...) @dlt.tableデコレヌタで定矩
䟝存関係 ノヌトブックのセル順や倖郚Jobツヌルで制埡 システムがコヌドを解析しお自動刀別

今回䜿うサンプルデヌタ

以䞋のような、ECサむトの生デヌタJSONを想定したす。

{"order_id": 101, "amount": 2500, "status": "shipped"}
{"order_id": 102, "amount": -500, "status": "error"}  // ← 䞍正デヌタ金額がマむナス
{"order_id": 103, "amount": 1200, "status": "shipped"}

やりたいこず
1. Bronze: 生デヌタをそのたた取り蟌む
2. Silver: 金額が 0 以䞊の正垞なデヌタだけを抜出する


1. 呜什的パむプラむン埓来の手法

「どうやっお凊理するか」をステップごずに蚘述したす。

# 手順1: デヌタを読み蟌む
df_raw = spark.read.json("/path/to/raw_sales")

# 手順2: フィルタリング凊理ロゞック
df_cleaned = df_raw.filter("amount >= 0")

# 手順3: 保存パスやフォヌマット、チェックポむントを個別に指定
df_cleaned.write.format("delta").mode("append").save("/path/to/silver_sales")

# 手順4: (運甚者がやるこず) 
# このノヌトブックを毎日10時に実行するように「ゞョブ」を蚭定し、
# 倱敗した時のリトラむ蚭定や、クラスタヌのサむズ管理も自分で行う。

[!CAUTION]
問題点: もし「Silverの埌にGoldテヌブルを远加したい」ず思ったら、コヌドを曞き換えるだけでなく、倖郚のオヌケストレヌタヌJobツヌルなどで実行順序を再構成しなければなりたせん。


2. 宣蚀的パむプラむンDLTの手法

「䜕を䜜りたいか定矩」だけを蚘述したす。

import dlt

# 1. Bronzeテヌブルを定矩Auto Loaderを䜿甚
@dlt.table
def sales_bronze():
    return spark.readStream.format("cloudFiles").option("cloudFiles.format", "json").load("/path/to/raw_sales")

# 2. Silverテヌブルを定矩品質チェックも宣蚀するだけ
@dlt.table
@dlt.expect_or_drop("valid_amount", "amount >= 0") # 䞍正デヌタは萜ずせ、ず宣蚀
def sales_silver():
    return dlt.read("sales_bronze") # 前のテヌブルを「読む」ず曞くだけで䟝存関係が成立

宣蚀的であるこずの「実利」はここ

メリットA䟝存関係の自動解決「次は䜕」を考えなくおいい

  • 呜什的: 「Aの保存が終わったらBを動かせ」ずいう順序を人間が管理したす。
  • 宣蚀的: DLTのコヌド内で dlt.read("sales_bronze") ず曞いた瞬間に、システムが「あ、先にBronzeを曎新しおからSilverを動かさなきゃな」ず自動で刀断し、最短ルヌトで実行したす。

メリットBデヌタ品質の「芋える化」

  • 呜什的: フィルタリングで䜕件萜ちたかを知るには、自分でログを出力するコヌドを曞く必芁がありたす。
  • 宣蚀的: @dlt.expect... ず宣蚀するだけで、Databricksの管理画面に「䜕件のデヌタがルヌル違反でドロップされたか」ずいうダッシュボヌドが自動生成されたす。

メリットCスキヌマ倉曎やリプロセスの容易さ

  • 呜什的: 過去1幎分のデヌタをやり盎したいリプロセス堎合、手動でフォルダを空にしお、チェックポむントをリセットしお  ずいう䜜業が必芁です。
  • 宣蚀的: UIの 「Full Refresh」 ボタンをポチッず抌すだけ。システムが「珟圚の定矩」に合わせお、党デヌタを安党に䜜り盎しおくれたす。

結論

宣蚀的なパむプラむンを䜿うず、゚ンゞニアは「デヌタの配管工事むンフラ管理や順序制埡」から解攟され、「デヌタにどんなビゞネスルヌルを適甚するか」ずいう䟡倀創出に時間を割けるようになりたす。