👊

dbtで開発環境と本番環境で使うデータのスキーマ情報が異なるときのtips

に公開

tl:dr

  • jinja便利

経緯

dbtで開発を行う際に、次のようなことがありました。

  • 検証環境、本番環境に流れるデータがある
  • 開発環境で利用するデータと上記のデータのスキーマ情報が異なる
  • なぜか経緯的にこれらのデータのスキーマ情報は合わせて開発することができない状況のため、そんな中でどんな形で開発ができるかを調べた

解決策

target.nameで参照カラムを変えるやり方で普通にいけました。
ルールとしては次のような感じでこの時は対応しました。

  • stg,prdにしかないカラムはstg,prdに合わせて、devはnullで埋める
  • devにしかないカラムはdevにカラム名を合わせる
  with bronze_data as (
      select
          {% if target.name in ['stg', 'prod'] %}
          {# stg/prd環境: カラム名を変換 #}
          PATTERN as DATA_PATTERN,        -- ← PATTERNをDATA_PATTERNに
          PRODUCT_NUMBER as PRD_NUM,      -- ← PRODUCT_NUMBERをPRD_NUMに
          DATE_TIME,                      -- ← そのまま
          JSONL as JSON,                  -- ← JSONLをJSONに

          -- 追加の17カラム(実データ)
          NANTOKA_KBN,
          EVENT_TIMESTAMP,
          ...
          {% else %}
          {# dev環境: カラム名そのまま #}
          DATA_PATTERN,
          PRD_NUM,
          DATE_TIME,
          JSON,

          -- 追加の17カラム(NULL埋め)
          NULL as NANTOKA_KBN,
          NULL as EVENT_TIMESTAMP,
          ...
          {% endif %}
      from {{ source('bronze', 'SAMPLE_BASE') }}

こうすることで、後続のcteでは環境差異を意識せずに処理が可能になりました。

※stg,prdにしか存在しないカラムは、後続の処理では重要ではないという前提です。

終わりに

  • なんか頭の悪いやり方している気もするのでいいやり方あったら知りたい
  • 普通に開発環境でも検証、本番と同じスキーマ情報でやれるのが一番良い(それはそう)

Discussion