🛤️

TROCCOのdbt連携で直面するdbtコマンド制約とその対処法

に公開

はじめに

TROCCO で dbt を動かしている人は、まだまだレアケースではないでしょうか。
本記事では、そんなニッチな利用者が悩んでるであろう?「対応していないdbtコマンドが使いたい」問題と、実務で取った具体的な対処方法をまとめます。
同じ課題に悩む方の参考になれば嬉しく思います。

対応する dbt コマンド

TROCCOのdbt連携で対応するコマンドは、必要最低限に絞られています。
具体的には、下記になります。ほとんどのケースでこれで事足ります。
https://documents.trocco.io/docs/dbt-job-configuration

  • dbt build: プロジェクト内の全リソースをビルドします。
  • dbt deps: パッケージをインストールします。
  • dbt run: モデルファイルを実行します。
  • dbt seed: アダプターにCSVファイルを転送します。
  • dbt snapshot: snapshotジョブを実行します。
  • dbt test: テストを実行します。
  • dbt run-operation: マクロを実行します。

下記を確認いただくと、dbt連携で使用できる以外に様々なコマンドがあることがわかります。
https://docs.getdbt.com/reference/dbt-commands

「対応していないdbtコマンドが使いたい」問題の対処を記載していきます。

dbt source freshness が使えない

dbt source freshness はソースデータの鮮度を確認できる便利なコマンドですが、TROCCO環境では未対応です。
そこで、代替として独自のデータテストを作成しました。

このコマンドが使いたかった。。。
dbt source freshness

https://docs.getdbt.com/docs/build/sources#checking-source-freshness

代替テスト例

/tests/generic/data_freshness.sql
{% 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.ymlvars を直接記述して対応します。
今回のケースでは ext_full_refresh: true を常に適用して問題なかったため、以下のように設定しました。

dbt_project.yml
vars:
  # dbt-external-tables
  ext_full_refresh: true

おわりに

TROCCOのdbt連携は機能制限があり、対応しているdbtコマンドだけでは対応しきれない場面がたまにあります。しかし、dbtの柔軟な設定・カスタムテストを活用することで、実務上の要件を満たすことは十分可能です。

参考

https://documents.trocco.io/docs/dbt-job-configuration
https://docs.getdbt.com/reference/dbt-commands
https://docs.getdbt.com/docs/build/sources#checking-source-freshness
https://github.com/dbt-labs/dbt-external-tables

Discussion