🏎

Piperiderでdbtを補強する

2022/12/08に公開約5,200字

Piperiderでdbtを補強する

dbt Advent Calendar 2022の9日目の記事です。Piperiderというツールの話をします。

何ができる?

  • こんなレポートを出力してくれる(百聞は一見にしかず)
  • レポートはGCS/S3/GAE/GitHub Pages等でホスティング可
  • 統計量をグラフにしてくれるので、ちょっと確認したい時に使える(ダッシュボード作ったりクエリ投げる手間がある程度省ける)
  • dbtと統合できるし、ナシでも動くので、試しやすい
  • 独自のテスト機能がある(dbtと統合した場合はdbtのテスト結果と合わせてレポートを生成してくれる)
  • elementary, re_data と異なりdbtのYAMLに何か書く必要がないので、環境が汚れにくい
  • 対応コネクタ(2022年12月9日現在)
    • BigQuery
    • CSV
    • DuckDB
    • Parquet
    • Postgres
    • Redshift
    • Snowflake

できないこと、苦手なこと、今後に期待すること

  • カスタムスキーマに対応していない(開発元の方に直接確認したところ、今後実装する予定とのこと)
  • 処理速度が遅め(ローカルじゃなくCI/CDなどで実行する分には気にならない)
  • elementary等と違って、時系列でデータをキープして異常検知することはできない(最新データと過去データの2つのレポート比較はできる)

使い方

今回サンプルのGitHubリポジトリを用意しました。これはBigQueryのsandbox上に構築したもので、オープンデータのMLB 2016 Pitch-by-Pitch(メジャーリーグのデータセット)を使用しています。dev containerも残しておきますので、もしよろしければお使いください。

それではまずPython 3.7+ であることを確認した上で、インストールします。

# BigQuery
$ pip install -U 'piperider[bigquery]' 

# Snowflake
$ pip install -U 'piperider[snowflake]'

# Redshift
$ pip install -U 'piperider[redshift]'

確認

$ piperider version

これでインストールは終了。次に初期化します。

# 作業用ディレクトリ作成(ここでは "piperider_dbt" という名前にしました)
$ mkdir piperider_dbt && cd piperider_dbt

# 今回はdbt統合パターンでいきます
$ dbt init

~~ dbtプロジェクトのセットアップは割愛 ~~

# dbtプロジェクトのディレクトリでこのコマンドを打つと、dbt-project.ymlとprofiles.ymlを読み込んで、dbtの情報も含めた設定ファイルを自動生成してくれます
$ piperider init

# 接続確認。dbt debugコマンドみたいなものです
$ piperider diagnose

準備が終わりました。レポート作成に入ります。

# 先にdbtを実行しておくと、dbt test結果をレポートに含めてくれます
$ dbt build

# 直近のdbt実行結果をレポート対象にしてくれます
$ piperider run --dbt-state ./target

レポート出力先が表示されます(出力先変更も可能)ので、index.htmlをブラウザで開くと閲覧ができます。

Generating reports from: ****/.piperider/outputs/latest/run.json
Report generated in ****/.piperider/outputs/latest/index.html

ではついでにpiperider独自のテストを自動生成してみましょう。コマンド1発で出ます。

$ piperider generate-assertions

サンプル結果①

サンプル結果②

ご覧の通り実データに基づいて生成されています。今回はしていませんが、実運用でこの機能を使うのであれば必要ないテストを削っていく工程が入ると思います。大量のカラムに対して一瞬でテストを生成してくれるので、時と場合によっては便利かもしれません。テスト結果のレポートはこちらで閲覧できます。一番右に記載がある通り、各テストがdbt由来なのかpiperider由来なのか明記されていますね。またschema.ymlにカラムのdescriptionを書いておきましたが、それがpiperiderの方(下矢印を押すと見えます)にも反映されていますね。

簡単ですが機能紹介は以上です。ご参考までにGitHub ActionsのYAMLサンプルを用意しました。流れは下記の通りです。

  1. Workload IdentityでGCP認証
  2. dbt build
  3. piperider run
  4. GitHub Pagesでホスティング

公式のPipeRider CLI Actionもありますが、私はあれこれカスタマイズしたい派なので自分で書いています。


name: piperider-ci

on:
  workflow_dispatch:

jobs:
  piperider-ci:
    runs-on: ubuntu-latest
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    permissions:
      contents: read
      pages: write
      id-token: write

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - uses: actions/setup-python@v4
        with:
          python-version: "3.9.x"

      # 「Google Workload identity federationでGitHub Actionsを設定してみた」 https://www.asobou.co.jp/blog/web/workload-identity
      - id: auth
        name: Authenticate to google cloud platform
        uses: google-github-actions/auth@v1
        with:
          workload_identity_provider: ${{ secrets.GCP_IDENTITY_PROVIDER }}
          service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}

      - name: install
        run: pip install -r requirements.txt

      - name: dbt run
        run: |
              cd piperider_dbt
              dbt --version
              dbt deps
              dbt build

      - name: PipeRider run
        run: |
              cd piperider_dbt
              piperider run --dbt-state ./target

      - name: Setup Pages
        uses: actions/configure-pages@v2

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v1
        with:
          path: 'piperider_dbt/.piperider/outputs/latest/'

      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v1

おまけ

star_cteというmacroをしれっと置いておきました。こんな感じで使うと、同じモデル・ファイル内のCTEから自由にカラムを取り出すことができます。CTE/カラム共に数が多い時にたまに使いたくなります。

GitHubで編集を提案

Discussion

ログインするとコメントできます