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

BigQueryのviewを
dbtのモデルにimportするOSSを作ってみた

 BigQueryのviewを
dbtのモデルにimportするOSSを作ってみた

@20250326 #bq_sushi #21

Ken Okumura

March 25, 2025
Tweet

Other Decks in Programming

Transcript

  1. 略歴 A メーカー → LINEヤフーでデータアナリスト → デジタル A 個人事業主(ベンチャー2社ほどお手伝い) 領域

    A 浅く広’ A 堅牢なデータパイプライe A CronとHiveQLとshellで違法増築されてるバッチ処理とか見ると
 「うわなんとかしなきゃ」って思うタイプ その他 A BigQueryは去年から触り始めたので初学者です 奥村 謙 デジタル庁 ファクト&データユニット アナリティクスエンジニア 2 / 15 @oxon3f3
  2. 機能 Y 指定されたデータセットからviewを全件取F Y 依存先のviewも含めて取得
 (DataLineage APIX Y dbtモデル生V Y

    configブロックやmodel propertyはカスタマイズ 可" Y 取得するviewのフィルタリング BigQueryのviewをdbtのモデルにimportするcli toolを作ってみた 5 / 15 普通逆(dbt開発したらBQにviewができる)ですよね... なぜ...? https://github.com/K-Oxon/dbt-view-importer
  3. 背景: ダッシュボード開発の初期は高速の試行錯誤が求められる https://digital-gov.note.jp/n/n2d16d32b7321 「Agile & Fragile」 p ダッシュボード開発しながらデータマートを微修正していくような ケースが多ˆ p

    速度を重視するために戦術的負債を積 p エンジニア以外がコンソール上でクエリを書‰ p → dbt管理外 「Trust & Robust」 p 手書きしたviewやtableをdbtに取り込 p 差分管理(git)や実行状態の監視、data testsなどにより堅牢´ p プロジェクトのフェーズ切替えによりエンジニアが着手 6 / 15
  4. s 指定したdatasetからview一覧とDDLの取q s Information Schema見ればお$ s 対象のviewが依存する先のviewも取り込みた s Data Lineage

    APIで依存するviewやtableを再 帰的に取q s 全てを取得後、再度Information Schemaから DDLを取q s SQLやYAMLの生f s jinjaでおk Information schemaとData Lineage APIを参照するbq2dbtを実装 むしゃくしゃしてやった。後悔はしていない。 8 / 15
  5. Data Lineage APIについて r 公式のReferenceくらいしか情報がなくて結構にらめっこ しC r LLMにRefつっこんでもハルシネーションしまくりだった ので結局引数と返り値を確認しながら実c r

    数少ない事例を投稿している方にも感D r zenn: “DataplexのデータリネージAPIを使って、対象のテーブルに 依存しているテーブルをスクリプトで列挙する” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 from import def for in if return google.cloud datacatalog_lineage_v1 (fully_qualified_name: , location: ) [ ]: project_id, dataset_id, table_name fully_qualified_name.split( ) bq_fqn {fully_qualified_name} target datacatalog_lineage_v1.EntityReference() target.fully_qualified_name bq_fqn request datacatalog_lineage_v1.SearchLinksRequest( target target, parent {project_id} {location} , ) lineage_client datacatalog_lineage_v1.LineageClient() page_result lineage_client.search_links(request request) dependencies [] link page_result: source_fqn link.source.fully_qualified_name source_fqn.startswith( ): bq_name source_fqn[ ( ) :] dependencies.append(bq_name) dependencies get_table_dependencies str str -> list str = = = = = = = = = = = = = len "." f"bigquery: " f"projects/ /locations/ " "bigquery:" "bigquery:" # BigQuery用のFQNフォーマット # 検索リクエストを作成 (指定viewをターゲットとするリンクを検索) # APIを呼び出し、結果を取得 # 結果を処理 # ソースからBigQueryの完全修飾名を抽出 # bigquery:project.dataset.tableから project.dataset.table 形式に変換 9 / 15 fqn指定で依存するリソースリンクを取得する例
  6. docs/aiへの出力がいい感じ H Agentにdocs/aiに計画や進捗を吐き 出させながら実装してもら2 H 1タスク終わったらdocsを出力させ て新しい会話にさっさと移h H 会話の最初で@docs/aiで思い出させ る

    とはいえ改善点も H タスクによってモデルを変えた方が 良さそう(今回は全てClaude 3.7r H 情報不足だとハルシネーションしが ち(Docsつっ込んでもr H たまに信じられないくらいサボるの で一つの会話のタスクは小さめに、 テストコードはちゃんと人間が見る とかが必要 人間はコーヒー飲んでネッ トサーフィンしてるだけ H 1 task 3-5 minくらいでできてÜ H Yoloモードはまだ怖いのでできあ がってきたらapproveポチポÁ H Markdownくらいしか自分で書いて ない・・Ð H total 2days くらい 閑話休題 実装はジェバンニ(Cursor)が一晩でやってくれました 11 / 15 大場つぐみ・小畑健 DEATH NOTE