0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

頻繁に使用するクエリは便利にしよう! USING dbt

Posted at

今回のモチベーション

データ分析基盤を開発している際に、よくあるのが
「このクエリよく叩くんだよなー」

このようなことをよく思うわけです

その都度同じクエリを実行したりすると、まぁ慣れているものでそんなにミスはしないのではありますが、面倒と思うことがよくあるわけです。
今回はそれを解消したいというのが発起です

一例

例えば、以下のようなマスタテーブルをDBに格納していたとします

image.png

昨今のDWHはかなりコストが抑えられていることからELTと言って
DWHで加工することがよくあります。

とりあえず溜め込むは重要!

DWHの開発においては「とりあえず取り込む」が結構重要だったりします。
アプリケーションのDBでは、マスタにuniqueがあるなんて問題あるなんて少し勉強していればわかると思いますが、
DWHにおいては、マスタテーブルに上記のように格納してあげることで、ある商品の価格推移が見れたりするので、「とりあえず取り込んで溜め込む」はめっちゃ重要です

その後に、最新のマスタ情報で分析したいなら
溜め込んだテーブルに対して、「最新データを取得する」をすればいいだけです。

--ざっくりこんな感じ
SELECT
    *
FROM
    TABLE
WHERE
    DATABASE_REGISTER_DATE = (SELECT MAX(DATABASE_REGISTER_DATE) FROM TABLE)

一例を踏まえて

ということで、データ活用のフェーズにおいては、いかんせんトランザクションデータに対して
最新のマスタは結局紐づけることはとても重要なので
マスタが多くなると、その分、そのクエリを書かなくてはいけないのではないか!

image.png

となるので、今回は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の良さをまた理解できたかなと思います。

それではまた

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?