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.
# 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.
{{ 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.
{{
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