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

ZetaSQLを使って、 カラムリネージ機能を作った話

gtnao
June 05, 2023

ZetaSQLを使って、 カラムリネージ機能を作った話

gtnao

June 05, 2023
Tweet

More Decks by gtnao

Other Decks in Programming

Transcript

  1. ©primeNumber Inc. 2 中根 直孝 (@gtnao) WHO AM I? 株式会社primeNumber

    (2018/11~now) Lead Engineer Twitter:@gtnao GitHub:@gtnao0219 趣味: 音楽(ギター)、飲酒、サウナ、将棋 1
 2
  2. ©primeNumber Inc. 3 データ分析基盤のための技術スタックを提供するサービス。 trocco®とは フルマネージド ETL/ELT 日本特有のサービスを含めた、約 100種のコネクタに対応 GUI

    ワークフロー 複雑なデータ処理フローを GUI 上で設定・運用 データマネジメント機能 データリネージ / Git 連携・コード管理 / スキーマ追従 / データカ タログ etc.
  3. ©primeNumber Inc. 7 SQLというただの文字列データを入力として、木構造のデータ構造を出力する。 その後のプログラムから扱いやすくなる。 SQLパーサーの役割 SQL AST(抽象構文木) Select ※

    一部ノードを省略 SelectList FromClause Path Expression Path Expression Identifier (id) Identifier (users) TablePath Expression Identifier (users) Identifier (name)
  4. ©primeNumber Inc. 9 リネージの作り方② AST① Select FromClause Path Expression Identifier

    (A) TablePath Expression Identifier (A) JOIN TablePath Expression Identifier (B) SelectColumn (省略) Identifier (name) Alias(a_name) SelectColumn SelectList SelectColumn (省略) a_nameは、 テーブルAの カラムname ※ ②は省略 sum_valueは、 テーブルAの カラムvalueと、 テーブルBの カラムvalueから 算出 b_nameは、 テーブルBの カラムname
  5. ©primeNumber Inc. 10 リネージの作り方③ 依存関係① 依存関係② 依存元 依存先 A.name C.a_name

    B.name C.b_name A.value C.sum_value B.value C.sum_value 依存元 依存先 C.a_name D.a_name C.sum_value D.sum_value
  6. ©primeNumber Inc. 12 • ZetaSQLはC++、Javaで利用可能。 • JavaのPublicなインターフェースでは実行プランの木構造だけしか出せない。 ◦ ※ 実行プランの木構造とは、ASTを元に生成されるクエリの実行計画の意味合

    いなどを含んだ木構造を意味しています。 ◦ (例:あるテーブルをindexスキャンするか、sequentialスキャンするか) • やむを得ず、C++で進める。 ◦ 言語自体も難しいが、Bazelというビルドツールを使う必要がある。 ◦ Publicなリポジトリとはいえ、社内ツール感が否めず、ドキュメントはほとん ど存在しない。 • 野良GitHubリポジトリを漁る日々。 苦労したこと
  7. ©primeNumber Inc. 14 • クエリをASTに変換できると、アイデア次第でできることが沢山ある。 ◦ ZetaSQLを使うと、BigQuery特有のQuery syntaxでもパース可能。 ◦ ただしキャッチアップが大変?

    ◦ サンドボックス環境を用意してみました。 ◦ https://github.com/gtnao0219/zetasql-docker-sandbox ▪ 初回ビルドが結構時間かかるのでご注意ください。 ▪ エディターの補完がDockerだとうまく行かずそこは間に合わず… 終わりに