今回のモチベーション
データ分析基盤を開発している際に、よくあるのが
「このクエリよく叩くんだよなー」
このようなことをよく思うわけです
その都度同じクエリを実行したりすると、まぁ慣れているものでそんなにミスはしないのではありますが、面倒と思うことがよくあるわけです。
今回はそれを解消したいというのが発起です
一例
例えば、以下のようなマスタテーブルをDBに格納していたとします
昨今のDWHはかなりコストが抑えられていることからELTと言って
DWHで加工することがよくあります。
とりあえず溜め込むは重要!
DWHの開発においては「とりあえず取り込む」が結構重要だったりします。
アプリケーションのDBでは、マスタにuniqueがあるなんて問題あるなんて少し勉強していればわかると思いますが、
DWHにおいては、マスタテーブルに上記のように格納してあげることで、ある商品の価格推移が見れたりするので、「とりあえず取り込んで溜め込む」はめっちゃ重要です
その後に、最新のマスタ情報で分析したいなら
溜め込んだテーブルに対して、「最新データを取得する」をすればいいだけです。
--ざっくりこんな感じ
SELECT
*
FROM
TABLE
WHERE
DATABASE_REGISTER_DATE = (SELECT MAX(DATABASE_REGISTER_DATE) FROM TABLE)
一例を踏まえて
ということで、データ活用のフェーズにおいては、いかんせんトランザクションデータに対して
最新のマスタは結局紐づけることはとても重要なので
マスタが多くなると、その分、そのクエリを書かなくてはいけないのではないか!
となるので、今回はdbtを使って解決したいなぁと思います。
macrosで解決しよう!
最初に全体像として、dbtのプロジェクト内で今回使用するフォルダ階層の一部です
─ macros
│ ├── latest_snapshot.sql
|
├── models
│ ├── project_A
│ │ ├── a_product_master_latest.sql
| | |── b_product_master_latest.sql
│ │ ├── schema.yml
│ │ └── src.yaml
次に、models/project_A/a_projecct_master_latest.sql
をお見せします
sourceの使い方は、自分でも説明していますが、よりわかりやすいものもあるので
それを見てもらえればと思います。
{{ latest_snapshot(source('SOURCE_DATA', 'PRODUCT_MASTER'),'REGISTER_DATE',materialized='view')}}
このクエリを説明すると、
latest_snapshot
というmacroを使って、そのクエリを参照して、引数だけ渡しているだけになります
第一引数;対象のテーブル名
第二引数:対象の列
第三引数:どのオブジェクト型で作成するか
次に、この根幹となっている latest_snapshot.sql
をみていきます。
--macros/latest_snapshot.sql
{% macro latest_snapshot(source_table, date_col, materialized='view',is_secure = true) %}
{{ config(materialized=materialized,secure=is_secure)}}
select *
from {{ source_table }}
where {{ date_col }} = (
select max({{ date_col }})
from {{ source_table }}
)
{% endmacro %}
見ただけであらかたご理解いただけたのではないでしょうか
このように定義することで、modelsには引数を与えてあげることで、
macrosで定義したクエリを流用することができるわけです。
ドキュメントの管理上、
テーブルごとに1つsqlファイルは作成する必要がありますが、
macrosを使うことで、その中で何をしているかは一目でわかるようになります。
まとめ
macrosを使うことで、よく使うクエリを流用できるようになりました。
dbtの良さをまた理解できたかなと思います。
それではまた