dbtのベストプラクティスを知る②
前回の記事
dbtのベストプラクティスを知る① - なむなむ
今回は、最後の2章からPro-tipsを学ぶぞ。
Pro-tips for workflows
Use the model selection syntax when running locally
Run only modified models to test changes ("slim CI")
- 自信をもってコード変更をマージするには、それによりプロジェクトの他の場所が壊れないか知っておく必要がある
- そのために、本番データとは別のサンドボックス環境で、gitワークフローの自動チェックとしてテストするのがおすすめ
- GitHubとdbt Cloudを使っている場合のCIジョブのセットアップ方法
- 同時に、プロジェクト内の全モデルをRun・テストするには時間も金もかかる
- dbtは、以前の本番Runの成果物と比較して、
- ①変更されたモデルを判断し、変更されていないモデルの上に構築できる
- ②モデルやテスト結果のステータスを判断できる
result:fail
,result:error
,result:pass
など
- ③賢く再実行するために、スコープ内のモデルでdbtコマンドを手動で上書きするのではなく、
result:<status>
ステータスを使う- ④誤ったモデルをすべて再実行し、同時に行った、誤ったモデルに関連する可能性のある変更も実行し、下流で使用
- ⑤誤ったモデルをすべて再実行し、再テスト
また、誤ったモデルに関連する可能性のある変更を同時に実行し、下流で使用 - 誤ったモデルや失敗したテストをすべて再実行
- 誤ったモデルをすべて再実行し、同時に行った、誤ったモデルに関連する可能性のある変更を実行し、下流で使用
- ⑥変更されたノードやエラーノードとは無関係のテストが失敗している(合格するためにデータロードをリフレッシュする必要があるソーステストと考える)
- 失敗したテストをすべて再実行し、それでも失敗するとわかっているテストは除外
- "EL"処理中にソースデータが更新され、リフレッシュ後に再実行が必要な場合にも適用できる
# ① dbt run -s state:modified+ --defer --state path/to/prod/artifacts dbt test -s state:modified+ # ③ dbt run --select state:modified+ result:error+ --defer --state path/to/prod/artifacts # ④ dbt build --select state:modified+ result:error+ --defer --state path/to/prod/artifacts # ⑤ dbt build --select state:modified+ result:error+ result:fail+ --defer --state path/to/prod/artifacts # ⑥ dbt test --select result:fail --exclude <example test> --defer --state path/to/prod/artifacts
※--state target/
フラグを使用する場合、result:error
とresult:fail
フラグはdbt build
コマンドを使用する場合のみ同時に(同じコマンドで)選択できます。dbt test
は以前のコマンド呼び出しでdbt run
からrun_results.json
を上書きする
stateに関するドキュメント
急に実践的すぎるな???
Pro-tips for dbt Projects
Limit the data processed when in development
- 開発環境において、実行時間を短縮することで、より迅速にコードを反復可能
- ターゲット名でデータを制限することで、実行速度を上げる
select * from event_tracking.events {% if target.name == 'dev' %} where created_at >= dateadd('day', -3, current_date) {% endif %}
Use hooks to manage privileges on objects that dbt creates
Separate source-centric and business-centric transformations
- モデリングの2段階
- この区別を明確にするために、2種の変換を別のモデルに分けることが最も有効
Managing whitespace generated by Jinja
- モデルでマクロやJinjaの他の部分を使用している場合、コンパイルされたSQL(target/compiledディレクトリにある)には不要な空白が含まれることがある
- 生成された空白を制御する方法→ Jinja のドキュメント
これも突然だな! しかし、意味的なモデル分類は重要そう 汎用性の高い中間テーブルを作るなどの意味で