Slide 1

Slide 1 text

BigQueryのviewを
 dbtのモデルにimportする OSSを作ってみた 2025-03-26 #bq_sushi #21 BigQueryとdbtだと? デジタル庁ファクト&データユニット アナリティクスエンジニア 奥村 謙

Slide 2

Slide 2 text

略歴 A メーカー → LINEヤフーでデータアナリスト → デジタル A 個人事業主(ベンチャー2社ほどお手伝い) 領域 A 浅く広’ A 堅牢なデータパイプライe A CronとHiveQLとshellで違法増築されてるバッチ処理とか見ると
 「うわなんとかしなきゃ」って思うタイプ その他 A BigQueryは去年から触り始めたので初学者です 奥村 謙 デジタル庁 ファクト&データユニット アナリティクスエンジニア 2 / 15 @oxon3f3

Slide 3

Slide 3 text

政策ダッシュボードをやっています (見てね) https://digital-gov.note.jp/n/nc22dc90cec65#e809884d-2708-427b-8259-95669e526cf7

Slide 4

Slide 4 text

注意事項 本資料・本日話す内容は、個人の見解であり、所属する組織の見解ではありません。 デジタル庁に関して、またはデジタル庁のデータ基盤に関して公知以外の情報はありません。 ご了承ください。 4 / 15

Slide 5

Slide 5 text

機能 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

Slide 6

Slide 6 text

背景: ダッシュボード開発の初期は高速の試行錯誤が求められる 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

Slide 7

Slide 7 text

めんどくさい プロジェクト多いとどれがダッシュボードに読み 込んでるviewだったか忘れるし、途中から使わな くなったviewとかがあったりとかもあるし、一個 一個思い出しながらviewのDDLコピペして、依存 先調べて繰り返して、from句をref()に変えたりし て、あ、yamlも書かないと… 困りごと 誰かなんかいい感じにしてくれる やつ作ってくれ〜 7 / 15

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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指定で依存するリソースリンクを取得する例

Slide 10

Slide 10 text

bq2dbtの動作イメージ デモ 10 / 15

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

時間があったらやりたいこと p PyPIでの公t p lineage API無しでも構文解析で
 なんとかするパターンも用意@ p `ref(“foo”)`への自動変& p 依存解析やDDL取得を抽象化すれば
 他の接続先でも使えるかも? 12 / 15

Slide 13

Slide 13 text

まとめ dbtへの取り込みを楽にするcli tool作ってみた これで開発初期にviewをたくさん作られても恐れずにdbtパイプライン実装の初速を上 げられる。 Data Lineage API ありがとう いつもお世話になってます。PythonのSDKの事例が少ないのでこれが一例になたら幸 い。 Cursor AgentとClaude すげー むしゃくしゃしたらmarkdownを書き始めよう。 コーヒー2杯くらい飲んでたらなんかできてる。 13 / 15

Slide 14

Slide 14 text

宣伝 https://digital-gov.note.jp/n/n2d16d32b7321 https://www.digital.go.jp/resources/dashboard-guidebook

Slide 15

Slide 15 text

End of Page Thank You