Piperiderでdbtを補強する
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サンプルを用意しました。流れは下記の通りです。
- Workload IdentityでGCP認証
- dbt build
- piperider run
- 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/カラム共に数が多い時にたまに使いたくなります。
Discussion