Traffine I/O

日本語

2022-12-30

dbtのDAG

DAG とは

DAGとは、Directed Acyclic Graphの略で、ノードが互いに方向性を持って関連し、方向性のある閉ループを形成しないグラフの一種です。例えば、「A -> B -> C」という実行順序はDAGであり、「A -> B -> C -> A」というような巡回する実行順序はDAGでありません。

データパイプラインの文脈においては、DAGは順序付けする必要があるタスクの集合を図示したものという意味合いで使われ、データモデル間の依存関係を理解するのに役立ちます。

例えば以下のような図がDAGになります。

DAG

このDAGから以下のことが分かります。

  • int_usersstg_usersstg_user_groupsから生成される
  • dim_usersstg_orgsint_usersから生成される
  • dim_usersはDAGの末端であり、4つの異なるモデルから生成される

DAGを見ればすぐにモデルの依存関係とデータの系統を理解することができます。

dbt における DAG

dbtではref関数を使うことでモデル間の依存関係、つまりはDAGを構築することができます。refの引数には他のモデルの名前を使います。

例えば以下のようなDAGを構築したいとします。

dbt DAG

stg_customers.sqlstg_orders.sqlはそれぞれ以下のようになっています。

models/stg_customers.sql
select
    id as customer_id,
    first_name,
    last_name
from xxx.raw_customers
models/stg_orders.sql
select
    id as order_id,
    user_id as customer_id,
    order_date,
    status
from xxx.raw_orders

customers.sqlではref関数を使い、stg_customersstg_ordersを参照します。

models/customers.sql
with customers as (
    select * from {{ ref('stg_customers') }}
),
orders as (
    select * from {{ ref('stg_orders') }}
),
customer_orders as (
    select
        customer_id,
        min(order_date) as first_order_date,
        max(order_date) as most_recent_order_date,
        count(order_id) as number_of_orders
    from orders
    group by 1
),
final as (
    select
        customers.customer_id,
        customers.first_name,
        customers.last_name,
        customer_orders.first_order_date,
        customer_orders.most_recent_order_date,
        coalesce(customer_orders.number_of_orders, 0) as number_of_orders
    from customers
    left join customer_orders using (customer_id)
)
select * from final

上記のように記述すると、まずはstg_customersstg_ordersが生成されます。そしてcustomersが生成され、そのときにstg_customersstg_ordersが参照されます。

このように、dbtではrefを使うことで簡単にモデルの依存関係を表現することができます。

参考

https://docs.getdbt.com/terms/dag
https://dev.classmethod.jp/articles/dbt-what-happen-in-not-dag/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!