dbt macrosを使って共通処理をリファクタリングする
はじめに
私が所属しているライフイズテックのデータ基盤グループでは、データの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.yml
でmacro-paths
で別途指定している場合はそのディレクトリ)にSQLファイルを配置します。
今回は、convert_timezone
というマクロで設定します。
タイムゾーン変換をしたいカラム名を引数に取って、タイムゾーン変換を行うマクロを作ります。
{% 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