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

BigQueryのTVFを型駆動で自動生成する世界

 BigQueryのTVFを型駆動で自動生成する世界

BigQueryのTVFのGoogle Colab上でTypeScriptの環境構築を行なって自動生成した事例です。
本資料は、8月20日に株式会社バックテック様主催の【オフライン開催】Mita.ts #7にてLTで発表させていただいたものになります。
https://mitats.connpass.com/event/360508/

Avatar for CUEBiC Inc.

CUEBiC Inc.

August 25, 2025
Tweet

More Decks by CUEBiC Inc.

Other Decks in Technology

Transcript

  1. スコープ 5 新規でデータ蓄積が 必要か? SQLで 加工可能か? YES YES NO BI上で動的な変更が

    あるか? GAS YES NO Dataform カスタムSQL YES 冗長な収集が必要か? (アカウント違いなど) スケジュール実行が 必要か? NO NO Google Colaboratory BigQueryの既存デー タを加工するか? サービスアカウント 認証は必要か? NO NO Cloud Run functions Workflows NO YES BigQuery YES
  2. 今回やったこと 8 以下をGoogle Colabで実施 1. 仕様定義 • TypeScriptの型で TVF仕様を宣言 (Param

    / Column / Measure / Grain) • 粒度切替や共通条件は設定オブジェクト( GrainConfigなど)に集約 • 安全演算や命名規約もテンプレ化 2. 自動生成 • 型定義を元に SELECT / WHERE / GROUP BY を自動生成 • Optionalパラメータは (param IS NULL OR …) で未指定時スルー • 生成SQLは CREATE OR REPLACE TABLE FUNCTION 形式で冪等適用 3. デプロイ/疎通確認 • Google Cloud BigQuery クライアントライブラリ( Python)で本番デプロイ • デプロイした関数を Pythonで呼び出し
  3. Google Colabとは? 9 Google Colab(Google Colaboratory) Googleが提供するブラウザ上で動作するPythonの実行環境 機械学習やデータ分析に必要なライブラリがプリインストールされている。 ▷特別な設定をすることなく、すぐにPythonコードを実行可能 ▷▷さらに無料でGPU利用可

    制約:無料プランではセッション毎に実行環境構築が必要 ※個人レベルの開発やQuickな疎通確認、プロトタイプのdemo用などが使い所 apt コマンドで Node.js(最新版)を直接インストールすることで、 クラウド上の仮想マシンを TypeScript対応のフルスタック実行環境 に改造可能 😈魔改造へのルートはここにあったのです😈
  4. TypeScriptをColabにどう入れた?? 10 # Node.js & tsx をインストール(bash) %%bash set -euo

    pipefail # Node.js 20 のインストール(Nodesource) apt-get update -y apt-get install -y curl ca -certificates gnupg # Nodesource のセットアップ & Node.js 20 を導入 curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt-get install -y nodejs # tsx & TypeScript をグローバル導入 npm i -g tsx TypeScript @types/node %%bash マジックを使用して、シェルスクリプトとして実行すると・・・ 😈
  5. Pythonとの比較 12 項目 Pythonの場合の面倒さ TypeScriptの場合のメリット スキーマ定義 カラム名・型を文字列で手書き → 漏れ・ミス が多い

    型として宣言 → 安全に変更可能 粒度別 CASE文作成 if/elif で逐次構築 → 冗長 配列+ map() → 自動生成で簡潔 カラムリスト管理 配列/dict直書き → 漏れ・順序ミス 定数配列+型補完 → 安全・抜けなし オプション WHERE句 配列/dict直書き → 漏れ・順序ミス optional フラグ → 一括生成 配布性 環境差で動作が不安定 .ts → JavaScriptにコンパイルされれば Node.jsで安定動作
  6. ポイント 13 項目 Before After(型駆動) 現状できている効果 仕様の一元管理 仕様がWiki/スプレッド/口頭、SQL は手書き・重複 TypeScriptの型

    (Param/Column/Measure/Grain)を 編集 → 生成器がDDLを自動出力 仕様の所在を一本化、コピペ差分 や人為ミスを排除 変更容易性 新列追加で複数SQLを手直し、 GROUP BY漏れや衝突が発生 配列に1行追加すれば SELECT/WHERE/GROUP BY自動 更新 変更コスト定数化、レビューは型 差分のみ 共通ロジック化 粒度CASE式・ゼロ割回避・共通 WHEREを毎回手書き GrainConfig・安全演算テンプレ ・whereExtrasで共通化 命名規約・NULLポリシーを自動統 一、品質下振れ消失 静的検証 実行して初めて型不整合や必須フィ ルタ不足に気付く TypeScriptの型でコンパイル時に 不整合を検出、Python側で Dry-runによりスキャン量と構文 を確認 型安全+Dry-runによる事前検証 は実現済み。ただしSQL Lintや値 域チェックは未導入
  7. まとめ 14 今回はTypeScriptの型定義を唯一の仕様書(Single Source of Truth)として BigQueryのTVFの自動生成を試みました TVFとは? BigQuery上で再利用可能なパラメータ付き SQL関数。

    複雑な集計ロジックを 一箇所に集約 し、呼び出し側は SELECT * FROM dataset.function(params…)で利用可能。 引数でフィルタや粒度を切り替えられるため、 事前集計不要で動的集計 が可能。 Python × TypeScript 併用( Colab実例) • TypeScript:型定義から TVF SQLを自動生成 • Python:生成SQLを BigQueryにDry-run検証 → デプロイ • 結果:属人性カット・変更コスト削減・事前チェックで事故予防 型駆動で採用してよかった点 • 仕様の一元管理 :型=TVF仕様、SQLは副産物として常に同期 • 変更容易性 :型に1行追加すればDDLを自動更新 • 共通ロジック化 :粒度切替、安全演算、共通 WHEREをテンプレ化 • 品質保証 :静的検証とDry-runで本番前にエラーや高コスト実行を防止