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

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

gtnao
June 05, 2023

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

gtnao

June 05, 2023
Tweet

Other Decks in Programming

Transcript

  1. ZetaSQLを使って、
    カラムリネージ機能を作った話
    2023.6 primeNumber Inc. Naotaka Nakane(SWE)

    View Slide

  2. ©primeNumber Inc.
    2
    中根 直孝 (@gtnao)
    WHO AM I?
    株式会社primeNumber (2018/11~now)
    Lead Engineer
    Twitter:@gtnao
    GitHub:@gtnao0219
    趣味:
    音楽(ギター)、飲酒、サウナ、将棋
    1
 2

    View Slide

  3. ©primeNumber Inc.
    3
    データ分析基盤のための技術スタックを提供するサービス。
    trocco®とは
    フルマネージド ETL/ELT
    日本特有のサービスを含めた、約 100種のコネクタに対応
    GUI ワークフロー
    複雑なデータ処理フローを GUI 上で設定・運用
    データマネジメント機能
    データリネージ / Git 連携・コード管理 / スキーマ追従 / データカ
    タログ etc.

    View Slide

  4. ©primeNumber Inc.
    4
    BigQueryなどのDWH上でクエリを実行して、
    その結果を同じDWH上の別テーブルへInsertする機能。

    データマート機能とは

    View Slide

  5. ©primeNumber Inc.
    5
    データマート機能で作ったテーブル同士の依存関係がカラム単位で可視化される機能。
    カラムリネージ機能とは
    ※ リネージ(lineage)は、「血統」を意味する学術用語

    View Slide

  6. ©primeNumber Inc.
    6
    https://github.com/google/zetasql
    BigQueryやCloudSpannerのSQLのパースに使われているらしいOSS。
    ZetaSQLとは

    View Slide

  7. ©primeNumber Inc.
    7
    SQLというただの文字列データを入力として、木構造のデータ構造を出力する。
    その後のプログラムから扱いやすくなる。
    SQLパーサーの役割
    SQL AST(抽象構文木)
    Select
    ※ 一部ノードを省略
    SelectList FromClause
    Path
    Expression
    Path
    Expression
    Identifier
    (id)
    Identifier
    (users)
    TablePath
    Expression
    Identifier
    (users)
    Identifier
    (name)

    View Slide

  8. ©primeNumber Inc.
    8
    リネージの作り方①
    データマート設定(SQL)①
    出力先:C
    データマート設定(SQL)②
    出力先:D
    ※ AテーブルとBテーブルをJOINしてCテーブルを作成 ※ CテーブルからさらにDテーブルを作成

    View Slide

  9. ©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

    View Slide

  10. ©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

    View Slide

  11. ©primeNumber Inc.
    11
    リネージの作り方④
    リネージ

    View Slide

  12. ©primeNumber Inc.
    12
    ● ZetaSQLはC++、Javaで利用可能。
    ● JavaのPublicなインターフェースでは実行プランの木構造だけしか出せない。
    ○ ※ 実行プランの木構造とは、ASTを元に生成されるクエリの実行計画の意味合
    いなどを含んだ木構造を意味しています。
    ○ (例:あるテーブルをindexスキャンするか、sequentialスキャンするか)
    ● やむを得ず、C++で進める。
    ○ 言語自体も難しいが、Bazelというビルドツールを使う必要がある。
    ○ Publicなリポジトリとはいえ、社内ツール感が否めず、ドキュメントはほとん
    ど存在しない。
    ● 野良GitHubリポジトリを漁る日々。
    苦労したこと

    View Slide

  13. ©primeNumber Inc.
    13
    ● BigQuery以外のDWHでは個別に実装が必要。
    ○ Snowflakeは2023年現在PublicなSQLパーサーを公開していないため対応できず。
    ○ RedshiftはPostgreSQLをベースとしているが、どこまでカバーできるか未検証。
    ● 最新のBigQueryのQuery syntaxに追従できない。
    ○ 一部Featureは明示的に対応しているがキリがない。

    課題

    View Slide

  14. ©primeNumber Inc.
    14
    ● クエリをASTに変換できると、アイデア次第でできることが沢山ある。
    ○ ZetaSQLを使うと、BigQuery特有のQuery syntaxでもパース可能。
    ○ ただしキャッチアップが大変?
    ○ サンドボックス環境を用意してみました。
    ○ https://github.com/gtnao0219/zetasql-docker-sandbox
    ■ 初回ビルドが結構時間かかるのでご注意ください。
    ■ エディターの補完がDockerだとうまく行かずそこは間に合わず…
    終わりに

    View Slide

  15. Happy Data Engineering!
    ご清聴ありがとうございました。

    View Slide