♻️

dbt macrosを使って共通処理をリファクタリングする

2024/03/25に公開

はじめに

私が所属しているライフイズテックのデータ基盤グループでは、データのTransformationにdbtを利用しています。今回はdbtのmacroを使って、共通処理をまとめてリファクタリングした事例を紹介します。

リファクタリングに至った背景

ライフイズテックではSnowflakeを導入し、Snowflakeにデータをロードする際にスキーマ検出とスキーマ進化を利用しています。その際にタイムスタンプのカラムはTIIMESTAMP_NTZとしてデータがロードされます。
プロダクトのタイムスタンプはUTCとして保存されているため、UTCのタイムスタンプがTIMESTAMP_NTZとして保存されています。ただサービス自体は日本でしか展開していないため、下記のように分析のためにdbtで事前に日本時間に変換をしています。

convert_timezone('UTC', 'Asia/Tokyo', created_at)

タイムスタンプのタイムゾーン変換は何度も同じ処理が各モデルに必要になるため、共通処理としてまとめることになりました。

リファクタリングの手順

dbt macrosの概要については、菱沼さんの
Jinja と Macros で dbt を使いこなそう
に詳しく説明されています。

dbtのmacrosというディレクトリ(dbt_project.ymlmacro-pathsで別途指定している場合はそのディレクトリ)にSQLファイルを配置します。

今回は、convert_timezoneというマクロで設定します。
タイムゾーン変換をしたいカラム名を引数に取って、タイムゾーン変換を行うマクロを作ります。

macros/convert_timezone.sql
{% macro convert_timestamp(column_name) %}
    convert_timezone('UTC', 'Asia/Tokyo', {{ column_name }})
{% endmacro %}

作成したマクロは{{ }}にマクロを入れることで呼び出すことができます。モデルから下記のように呼び出します。

select
    {{ convert_timestamp('created_at') }} as created_at
from
    {{ source('database', 'table') }}

マクロの部分が変換されて、コンパイルすると下記のようなSQLが生成されます。

select
    convert_timezone('UTC', 'Asia/Tokyo', created_at) as created_at
from
    database.table

このようにマクロを利用することでコードの再利用性が向上し、リファクタリングが可能になります。

宣伝

ライフイズテック サービス開発部では、月毎に気軽にご参加いただけるカジュアルなイベントを実施しています。開催予定のイベントは、 connpass のグループからご確認ください。興味のあるイベントがあったらぜひ参加登録をお願いいたします。皆さんのご参加をお待ちしています!

Discussion