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

BigQueryでリスク計算をしている話

 BigQueryでリスク計算をしている話

eScanの肝である「リスク計算」のロジックを、TypeScript(Node.js)からBigQueryに移行しSQLで実装し直した
その経緯とそれを支えるBigQueryのTipsについて紹介

Takafumi Hirata

March 15, 2024
Tweet

Transcript

  1. 3 自己紹介 • 平田尚史(ひらたたかふみ) ◦ github: totem3 ◦ X: takhirata

    • これまで ◦ ソーシャルゲームの開発や裏側のインフラの運用(オンプレ・ AWS) ◦ データ基盤の構築・分析の支援 ◦ など • 今 ◦ eScanという「日本の電力事業に特化したポートフォリオ最適化システム」を開発 ◦ バックエンド〜基盤よりの設計・開発が多め ◦ 必要に応じてフロントエンドも頑張る
  2. 9 なぜBigQueryなのか 我々が基盤に求めていた要件 • 扱うデータが増えても勝手にスケールして欲しい ◦ メモリやCPUなどのリソース的にも ◦ 分散処理などで実行時間もデータに比例して増えない •

    インフラ部分の運用・管理は全てクラウドに任せたい • 計算に利用した入力データや計算の中間結果はしばらく保持しておきたい • 地域・年月・帳簿・・・などなど様々なディメンションとその組み合わせによる計 算をシンプルに記述できる
  3. 10 なぜBigQueryなのか BigQueryやSparkが候補に挙がったが、BigQueryに軍配が上がった • インフラ構築の手間がかからない • 既存のシステムとの親和性 ◦ →BigQuery自体は既に社内の各所で使われていて、eScanでも共通デー タ基盤のBigQueryからPostgreSQLにデータをインポートしていたが、

    BigQueryにすればそれが不要になる • SQLを使うメリット ◦ SQLはどこでも使っているので、Node.jsに加えてPython(やJava)など他 の言語を追加で使うのに比べて敷居が低い ◦ PdMや数理モデルを構築するクオンツなど、エンジニア以外でもデータを 使うことができる
  4. 14 ユーザー定義関数(UDF) JavaScriptのライブラリをIIFE (即時実行関数式) でビルドすれば使える。 BigQueryでロジックを実装する際の武器たち CREATE TEMP FUNCTION myFunc

    ( a FLOAT64, b STRING) RETURNS STRING LANGUAGE js OPTIONS (library=['gs://my-bucket/path/to/lib1.js','gs://my-bucket/path/to/lib2.js']) AS r """ // Assumes 'doInterestingStuff' is defined in one of the library files. return doInterestingStuff(a, b); """ ; SELECT myFunc(3.14,'foo'); UDFを作る際に LANGUAGEでjs を指定 OPTIONSでlibrary にGCS上のライブラ リのpathを指定
  5. 15 ユーザー定義関数(UDF) 注意点 • BigQueryのドキュメントのベストプラクティスにも記載がある通り、処理中に使 えるメモリには上限があるので、大量のデータを扱う処理は避ける • JavaScriptの実行環境のタイムゾーンはUTCではなく、PDT/PSTなので日付 の操作を行う場合には要注意 •

    デバッグは例外を投げることによるprintデバッグくらいしかできないため、 BigQueryからは関数呼び出しだけにしてBigQueryの外でデバッグできるよう にするのが無難 BigQueryでロジックを実装する際の武器たち