TROCCOのdbt連携で直面するdbtコマンド制約とその対処法
はじめに
TROCCO で dbt を動かしている人は、まだまだレアケースではないでしょうか。
本記事では、そんなニッチな利用者が悩んでるであろう?「対応していないdbtコマンドが使いたい」問題と、実務で取った具体的な対処方法をまとめます。
同じ課題に悩む方の参考になれば嬉しく思います。
対応する dbt コマンド
TROCCOのdbt連携で対応するコマンドは、必要最低限に絞られています。
具体的には、下記になります。ほとんどのケースでこれで事足ります。
- dbt build: プロジェクト内の全リソースをビルドします。
- dbt deps: パッケージをインストールします。
- dbt run: モデルファイルを実行します。
- dbt seed: アダプターにCSVファイルを転送します。
- dbt snapshot: snapshotジョブを実行します。
- dbt test: テストを実行します。
- dbt run-operation: マクロを実行します。
下記を確認いただくと、dbt連携で使用できる以外に様々なコマンドがあることがわかります。
「対応していないdbtコマンドが使いたい」問題の対処を記載していきます。
dbt source freshness が使えない
dbt source freshness はソースデータの鮮度を確認できる便利なコマンドですが、TROCCO環境では未対応です。
そこで、代替として独自のデータテストを作成しました。
dbt source freshness
代替テスト例
{% test data_freshness(
model, column_name, error_after_count, error_after_period, filter
) %}
with
freshness_check as (
select max({{ column_name }}) as max_loaded_at
from {{ model }}
{% if filter %} where {{ filter }} {% endif %}
)
select
max_loaded_at,
{{ dbt.current_timestamp() }} as executed_at,
{{ dbt.datediff("max_loaded_at", dbt.current_timestamp(), error_after_period) }}
as diff_count
from freshness_check
where
{{ dbt.datediff("max_loaded_at", dbt.current_timestamp(), error_after_period) }}
>= {{ error_after_count }} -- エラーになる閾値
{% endtest %}
設定例①(6日以上古ければエラー)
~
- name: event_date
data_tests:
- data_freshness:
error_after_count: 6
error_after_period: day
filter: date_diff(current_date, event_date, DAY) < 10
~
設定例②(23時間以上古ければエラー)
~
data_tests:
- unique:
column_name: id
- not_null:
column_name: id
- data_freshness:
column_name: created_at
error_after_count: 23
error_after_period: hour
~
下記コマンドで、dbt source freshnessに近いのデータテストが可能になります。
※ dbt source freshnessのように、warningレベルは設定できません。
dbt test --select source:~
実行結果
[INFO]: running... dbt test --select source:~
[INFO]: Running with dbt=1.9.10
[INFO]: Registered adapter: bigquery=1.9.2
[INFO]: START test source_data_freshness_~_created_at__23__hour [RUN]
[INFO]: PASS source_data_freshness_~_created_at__23__hour .... [PASS in 4.89s]
dbt run-operation で --varsが指定できない
dbt run-operation の--varsオプションが設定できません
例えば以下のようなコマンドは設定できません。
dbt run-operation stage_external_sources \
--args "select: 〜〜〜" \
--vars "ext_full_refresh: true"
回避策
dbt_project.yml に vars を直接記述して対応します。
今回のケースでは ext_full_refresh: true を常に適用して問題なかったため、以下のように設定しました。
vars:
# dbt-external-tables
ext_full_refresh: true
おわりに
TROCCOのdbt連携は機能制限があり、対応しているdbtコマンドだけでは対応しきれない場面がたまにあります。しかし、dbtの柔軟な設定・カスタムテストを活用することで、実務上の要件を満たすことは十分可能です。
参考
Discussion