Traffine I/O

Bahasa Indonesia

2022-12-30

DAG dalam dbt

Apa itu DAG

DAG adalah singkatan dari Directed Acyclic Graph (Graf Asiklik Terarah), sebuah jenis graf dimana node-node saling berhubungan satu sama lain secara terarah dan tidak membentuk sebuah lingkaran tertutup terarah. Sebagai contoh, urutan eksekusi "A -> B -> C" adalah DAG, sementara urutan eksekusi siklik seperti "A -> B -> C -> A" bukanlah DAG.

Dalam konteks pipeline data, DAG digunakan dalam arti bahwa itu adalah representasi grafis dari sekumpulan tugas yang perlu diurutkan, dan membantu untuk memahami ketergantungan di antara model data.

Sebagai contoh, diagram berikut ini adalah DAG.

DAG

Dari DAG ini kita bisa melihat yang berikut ini:

  • int_users dihasilkan dari stg_users dan stg_user_groups.
  • dim_users dibuat dari stg_orgs dan int_users.
  • dim_users adalah akhir dari DAG dan dihasilkan dari 4 model yang berbeda.

DAG memungkinkan kita untuk dengan cepat memahami ketergantungan model dan silsilah data.

DAG dalam dbt

Dalam dbt, fungsi ref dapat digunakan untuk membangun model dependensi, atau DAG. Parameter dari ref adalah nama model lain.

Sebagai contoh, misalkan anda ingin membuat DAG berikut ini.

dbt DAG

stg_customers.sql dan stg_orders.sql masing-masing adalah sebagai berikut.

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

Di customers.sql, gunakan fungsi ref untuk mereferensikan stg_customers dan stg_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

Hal di atas pertama-tama akan menghasilkan stg_customers dan stg_orders. Kemudian customers dibuat, dan stg_customers dan stg_orders direferensikan pada saat itu.

Dengan demikian, dbt dapat dengan mudah mengekspresikan ketergantungan model dengan menggunakan ref.

Referensi

https://docs.getdbt.com/terms/dag

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!