Traffine I/O

Bahasa Indonesia

2022-12-30

Materialisasi

Apa itu materialisasi

Materialisasi adalah definisi data saat membuat dbt model. dbt memungkinkan Anda untuk memilih di antara empat jenis materialisasi berikut:

  • View
  • Table
  • Ephemeral
  • Incremental

Ketika memilih materialisasi, penting untuk mempertimbangkan efek hilir seperti waktu eksekusi query dan fungsi makro.

View

Model View dibangun kembali melalui pernyataan CREATE di setiap run.In dbt, jika Anda tidak menentukan materialisasi, maka model ini secara default adalah View. Model View memiliki karakteristik sebagai berikut:

  • Pembuatan model yang cepat karena tidak ada pergerakan data.
  • View dengan transformasi besar atau view yang ditumpuk di atas view lain bisa lambat untuk di-query.

Table

Model Table dibangun kembali pada setiap kali dijalankan melalui pernyataan CREATE TABLE as.

  • Umumnya lebih cepat untuk query daripada View
  • Masalah biaya dan runtime muncul jika sejumlah besar data diisi ulang setiap kali.

Ephemeral

Model Ephemeral diperlakukan sebagai CTE (common table expression) dan menginterpolasi ke model dependen. Dengan kata lain, model Ephemeral tidak dihasilkan sebagai model data dengan sendirinya, tetapi dikenali sebagai referensi dari model data lainnya.

Incremental

Model Incremental dihasilkan sebagai tabel untuk pertama kalinya dan diperbarui secara bertahap setelahnya tanpa membangun kembali; model Incremental membutuhkan logika untuk menentukan perbedaan dari proses sebelumnya dan makro is_incremental() harus ditetapkan.

Konfigurasi materialisasi

Model dbt dimaterialisasi sebagai View secara default. Model dimaterialisasi dengan parameter konfigurasi materialized sebagai berikut.

dbt_project.yml
# The following dbt_project.yml configures a project that looks like this:
# .
# └── models
#     ├── csvs
#     │   ├── employees.sql
#     │   └── goals.sql
#     └── events
#         ├── stg_event_log.sql
#         └── stg_event_sessions.sql

name: my_project
version: 1.0.0
config-version: 2

models:
  my_project:
    events:
      # materialize all models in models/events as tables
      +materialized: table
    csvs:
      # this is redundant, and does not need to be set
      +materialized: view

Anda juga dapat mengatur materialisasi secara langsung dalam file SQL model.

hoge.sql
{{ config(
    materialized='table',
  )
}}

SELECT *
FROM ...

Untuk Incremental

Karena model Incremental adalah pembaruan inkremental, maka perlu memasukkan logika untuk menentukan perbedaannya. Dalam contoh berikut, logikanya adalah memperbarui secara bertahap hanya catatan dengan tanggal yang lebih baru dari tanggal terbaru di kolom created_at dari model data saat ini.

hoge.sql
{{
    config(
        materialized='incremental'
    )
}}

SELECT
  xxx,
  yyy,
  zzz,
  created_at
FROM `my_table`

{% if is_incremental() %}
  where created_at > (select max(created_at)) from {{ this }})
{% endif %}

On the first run, is_incremental() is false and the query is executed without a WHERE clause; on the second and subsequent runs, is_incremental() is true and incremental updates are performed.

Referensi

https://docs.getdbt.com/docs/build/materializations
https://docs.getdbt.com/terms/table
https://docs.getdbt.com/terms/view

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!