Lewati ke konten utama

Tutorial dbt: 7 Konsep yang Wajib Diketahui untuk Data Engineer

Pelajari 7 konsep terpenting seputar dbt — alat favorit para data engineer modern.
Diperbarui 28 Sep 2026  · 11 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Apa itu dbt dan mengapa penting?

Selama beberapa tahun terakhir, komunitas data science perlahan menerima paradigma berpusat pada data. Alih-alih mengejar model machine learning yang makin kompleks, kita akhirnya lebih fokus pada kualitas data. Hal ini memicu melonjaknya popularitas data engineer. Kini mereka memperoleh gaji yang dulunya hanya diberikan kepada data scientist atau ML engineer berpengalaman.

Dan salah satu alat yang secara signifikan membuat hidup data engineer lebih baik adalah dbt (data build tool). Tujuannya adalah menghadirkan praktik terbaik rekayasa perangkat lunak yang telah teruji pertempuran ke dalam data engineering dan menghasilkan nilai dari data secepat dan semudah mungkin.

Artikel ini akan membahas dasar-dasar dbt untuk data engineer tingkat pemula yang ingin menambahkan alat tak tergantikan ke dalam repertoarnya. Anda juga dapat melihat kursus Introduction to dbt kami untuk mempelajari lebih lanjut tentang alat yang kuat ini.

Prasyarat

Hanya beberapa untuk artikel ini:

  • SQL dasar hingga menengah: jika Anda tahu cara menggunakan klausa WHERE dan GROUP BY, Anda siap melanjutkan.
  • Terbiasa dengan terminal: kenyamanan menggunakan terminal, lingkungan virtual, dan memasang perangkat lunak dengan manajer paket seperti pip atau homebrew semuanya diperlukan.
  • Dasar-dasar data warehouse: pengetahuan fundamental tentang data engineering adalah nilai plus besar. Tidak harus sedalam Anda mengetahui proses empat langkah Kimball, tetapi cukup untuk memahami beberapa istilah kunci.

Jika Anda belum memenuhi kriteria ini namun atasan (atau Anda sendiri) tetap mengharuskan Anda mempelajari dbt, Anda dapat menggunakan sumber daya berikut:

Apa Saja yang Akan Dibahas Panduan dbt Ini?

Komunitas open source menyukai dbt, sehingga mereka berhasil mengintegrasikannya dengan hampir setiap alat yang bekerja dengan data. Hasilnya? Dokumentasi yang begitu masif hingga bahkan panduan memulai cepatnya lebih panjang daripada dokumentasi seluruh pustaka Python.

Jadi, tujuan saya dengan artikel ini adalah memperkenalkan tujuh konsep inti dbt dengan tingkat teknis moderat di sela-selanya. Setelah menyelesaikan tutorial ini, Anda dapat membuka halaman mana pun dari dokumentasi dbt dan memahami apa yang terjadi.

Sekarang, mari kita langsung mulai!

Konsep dbt yang Wajib Diketahui

0. Data warehouse

Salah satu konsep prasyarat yang perlu Anda ketahui adalah data warehouse. Warehouse adalah tempat Anda menyimpan semua data yang dimiliki suatu perusahaan.

Perusahaan membangun warehouse karena memungkinkan analitik dan semua hal lain yang dapat Anda lakukan dengan data (ehm, data terstruktur). Warehouse menyimpan data historis yang diatur ke dalam tabel, dan terstruktur untuk kueri dan analisis yang cepat.

Ada banyak alat yang mengimplementasikan data warehouse:

  • PostgreSQL
  • MySQL
  • Snowflake
  • BigQuery
  • Redshift

dan seterusnya.

dbt tidak membantu Anda mengumpulkan atau memuat data ke alat-alat di atas, tetapi mentransformasi data di dalamnya. Dengan kata lain, dbt melakukan huruf T dalam proses ETL/ELT (extraction, transformation, load) yang menjadi inti semua warehouse.

1. dbt Core vs. dbt Cloud

dbt ditawarkan melalui dua antarmuka: dbt Core dan dbt Cloud.

dbt Core adalah pustaka open source yang mengimplementasikan sebagian besar fungsionalitas dbt. Ia memiliki antarmuka baris perintah (perintah dbt yang akan Anda sukai) yang dapat Anda gunakan untuk mengelola transformasi data dalam proyek Anda.

dbt Cloud adalah solusi enterprise untuk tim. Di atas CLI, dbt Cloud juga menyediakan IDE berbasis web yang lebih ramah pengguna. Dengannya, Anda tidak perlu terlalu khawatir tentang koneksi basis data dan pengeditan file YAML (sebagaimana akan Anda lihat di bagian berikut).

dbt Cloud juga menawarkan fitur tambahan seperti penjadwalan job, integrasi lanjutan, dan dukungan prioritas tinggi.

Berikut tabel yang merangkum perbedaan antara dbt Core dan dbt Cloud:

image2.png

Terlepas dari fitur tambahan tersebut, kita akan membahas dbt Core karena paling cocok untuk proyek lokal, pengujian, dan pembelajaran. Anda dapat menginstalnya dengan pip di OS mana pun (tentu di dalam lingkungan virtual).

Saya akan menggunakan lingkungan Conda:

$ conda create -n learn_dbt -y
$ pip install dbt-<adapter_name>

Anda harus mengganti adapter_name dengan basis data yang ingin Anda gunakan. dbt Labs (perusahaan di balik dbt) telah mengintegrasikan banyak adapter untuk berbagai platform data.

Dalam artikel ini, kita akan menggunakan adapter dbt-duckdb untuk terhubung ke basis data DuckDB. Namun Anda dapat menggunakan salah satu adapter yang tercantum di halaman ini pada dokumentasi dbt.

$ pip install dbt-duckdb

Itu saja untuk penyiapan awal!

2. Proyek dbt

Secara garis besar, proyek dbt adalah direktori di mesin Anda yang berisi semua yang diperlukan untuk melakukan transformasi pada data Anda. Isinya banyak file .sql (disebut model) dan file YAML (untuk konfigurasi).

Untuk membuat proyek dbt, Anda dapat menggunakan perintah dbt init <project_name> di CLI:

$ dbt init dbt_learn

Terminal akan meminta Anda memasukkan kode yang sesuai dengan adapter platform data yang tersedia. Karena Anda hanya memiliki DuckDB, Anda dapat menekan 1.

$ cd dbt_learn

Di dalam dbt_learn, Anda memiliki struktur berikut:

image1.png

Di sinilah data engineer menjadi software engineer karena proyek dbt memungkinkan Anda untuk:

  • Tertata dan modular: menjaga transformasi data tetap terorganisasi dan dipisahkan menjadi unit yang mudah dikelola, sehingga kode Anda lebih mudah dipahami dan dirawat.
  • Kontrol versi: melacak perubahan dan kembali ke versi sebelumnya dari model Anda, memastikan konsistensi dan reprodusibilitas data.
  • Kolaborasi: menambahkan banyak pengguna yang dapat bekerja pada proyek yang sama dengan peran dan izin yang ditentukan.
  • Dapat diuji: menulis pengujian untuk model Anda guna memastikan model bekerja sebagaimana mestinya dan mengidentifikasi potensi masalah sebelum diterapkan ke produksi.
  • Dapat diulang: menggunakan proyek yang sama untuk transformasi data yang konsisten di berbagai sumber data dan lingkungan.

Singkatnya, proyek dbt menawarkan cara yang kuat untuk mengelola dan mengorkestrasi transformasi data. Proyek ini menghadirkan manfaat rekayasa perangkat lunak yang telah lama dinantikan ke dunia data.

3. Profil Proyek dbt

Kita telah menginisialisasi proyek dbt dan sekarang, kita perlu terhubung ke basis data yang ada (atau membuatnya dari nol). Untuk melakukannya, kita membutuhkan cara yang aman untuk memberikan kredensial basis data kepada dbt agar dapat membangun koneksi. Di sinilah kita akan menggunakan profil proyek.

Profil proyek adalah file YAML yang berisi detail koneksi untuk platform data pilihan Anda. File ini dibuat di direktori .dbt di $HOME dan diberi nama profiles.yml. Berikut tampilannya saat ini:

image4.png

File tersebut mencantumkan satu profil bernama dbt_learn untuk proyek kita. Profil ini menentukan dua output: dev dan prod.

Output adalah konfigurasi individual yang menentukan koneksi berbeda ke data warehouse atau basis data. Melalui output, Anda dapat mengelola koneksi ke berbagai lingkungan:

  • Pengembangan
  • Pengujian
  • Produksi dan seterusnya.

Dalam profil kita, output default adalah dev, yang tercantum pada kolom target. Anda dapat mengubahnya ke output lain sesuai kebutuhan. Untuk saat ini, kita biarkan apa adanya.

Catatan: Anda dapat mengubah nama profil dan output selama keduanya direferensikan dengan benar di sisa file dbt.

Kolom path menentukan lokasi basis data yang sudah ada bernama dev.duckdb. Jika belum ada, basis data akan dibuat oleh adapter dbt DuckDB di direktori kerja kita (di dalam proyek dbt_learn; kolom path menentukan path relatif terhadap direktori proyek). Karena kita belum memiliki basis data bernama dev.duckdb, kita akan membiarkan dbt membuatnya dengan menjalankan dbt debug.

$ dbt debug

Sub-perintah debug digunakan untuk menguji banyak aspek proyek seperti:

  • Kesalahan pada file profiles.yml
  • Detail koneksi basis data di profiles.yml
  • Adapter basis data
  • Kesalahan pada file dbt_project.yml dan lain-lain.

Jika Anda menerima pesan hijau “All tests passed” dan basis data dev.duckdb baru muncul, maka Anda siap melanjutkan.

4. Model dbt

Model adalah inti dari dbt karena merepresentasikan transformasi nyata yang membuat dbt terkenal.

Model data adalah gagasan konseptual yang mewakili struktur dan relasi dalam sekumpulan data. Model data di dbt lebih sederhana dan spesifik. Model memiliki atribut berikut:

  • Mewakili transformasi data (seperti melakukan operasi pembersihan)
  • Biasanya ditulis dengan SQL dalam file .sql (Python diperbolehkan di versi dbt yang lebih baru)
  • Biasanya terdiri dari satu kueri SELECT

Proyek dbt_learn kita sudah terisi dua model dummy di dalam models/example:

image6.png

Kita akan menghapusnya dan membuat milik kita sendiri:

$ rm -rf models/example
$ mkdir models/stats
$ touch models/stats/average_diamond_price_per_group.sql

Pada baris terakhir cuplikan kode di atas, kita membuat model bernama average_diamond_price_per_group di dalam direktori stats. Penting untuk deskriptif dalam menamai model.

Di dalam model (file .sql), tempelkan kueri SQL uji dummy ini:

SELECT 1 AS Id

dan jalankan model dengan dbt run:

$ dbt run

Anda seharusnya menerima pesan hijau “Completed successfully”.

Setelah semuanya siap, kita dapat memuat beberapa data ke dalam basis data dev.duckdb kita. Kita akan menggunakan file parquet untuk melakukannya, karena DuckDB mendukungnya secara native.

SELECT AVG(price), cut
 FROM "diamonds.parquet"
GROUP BY cut

Kueri tersebut seharusnya mengembalikan pesan sukses yang sama.

Untuk tutorial ini, saya sudah menyiapkan dataset diamonds sebagai file parquet. Di GitHub gist ini, Anda dapat menemukan cuplikan untuk mengunduhnya ke workspace Anda.

Kita baru saja melihat cara membuat model dbt pertama kita dengan menggunakan pernyataan SELECT yang mengembalikan beberapa statistik ringkasan tentang sebuah dataset. Dalam praktiknya, model Anda akan bergantung pada kebutuhan bisnis dan bagaimana para karyawan bekerja dengan basis data Anda. Oleh karena itu, kita tidak akan berfokus pada logika aktual model dbt, melainkan pada cara mengimplementasikannya dengan benar.

5. DAG di dbt

Dalam proyek dunia nyata, model Anda kemungkinan besar saling bergantung, membentuk semacam hierarki. Dalam dunia data, hierarki ini disebut Direct Acyclic Graph (DAG) atau grafik garis keturunan (lineage).

Satu DAG dapat menggantikan dokumentasi seribu kata. Lihat contoh ini dari halaman DAG dbt:

image3.png

Ada empat model dalam grafik ini, semuanya terhubung linier ke model downstream. stg_users dan stg_user_groups adalah model induk dari int_users, yang pada gilirannya menjadi model induk dari dim_users bersama dengan model stg_orgs di hulu.

Catatan: kata upstream dan downstream sering digunakan untuk merujuk posisi relatif setiap model dalam DAG.

Satu aspek kunci dari DAG adalah tidak ada loop tertutup. Artinya model downstream, yang merupakan hasil dari model sebelumnya, tidak dapat digabungkan dengan model upstream. Di situlah kata acyclic berasal.

Selain kekayaan visual DAG, tujuannya adalah memungkinkan dbt membangun/memperbarui model sesuai dependensinya. Jika kita tidak mendefinisikan DAG untuk empat model di atas, dbt akan membangunnya dalam urutan alfabet. Ini akan menghasilkan segala macam pesan merah dan kesalahan.

Untuk mendefinisikan DAG di dbt, kita akan menggunakan templating Jinja.

6. Templating Jinja di dbt

Pada DAG di atas, model int_users merupakan hasil dari stg_users dan stg_user_groups. Kita perlu menentukan hubungan ini dalam proyek kita, jika tidak dbt run akan mengeksekusi semua model secara alfabet, yang berarti int_users berjalan lebih dulu. Ini akan menyebabkan error karena dependensinya belum termaterialisasi.

Saat ini, model int_users mungkin terlihat seperti ini:

SELECT some_column
 FROM stg_users as su
 JOIN stg_user_groups as sug
   ON su.a = sug.a

Sekarang, kita akan menautkan ketiga model tersebut dengan mengubahnya menjadi node DAG menggunakan Jinja:

SELECT some_column
 FROM {{ ref("stg_users") }} as su
 JOIN {{ ref("stg_user_groups" )}} as sug
   ON su.a = sug.a

Alih-alih menulis nama model secara langsung, kita menaruhnya di dalam fungsi Jinja bernama ref. Sintaksnya adalah {{ ref("column_name") }} (perhatikan spasi dan tanda kutipnya). Saat kueri kita dikompilasi, fungsi Jinja akan digantikan dengan nama model sebenarnya.

Perhatikan bahwa stg_users dan stg_user_groups harus ada sebagai file .sql di proyek dbt Anda.

Sekarang, saat kita mengeksekusi dbt run, dbt akan mencari dependensi setiap model, menghubungkannya, dan mengeksekusinya sesuai urutan.

Fungsi ref di Jinja bukan satu-satunya yang dapat kita gunakan di dbt. Faktanya, dengan menggunakan fungsi dan fitur Jinja lainnya, Anda dapat memperluas fungsionalitas pernyataan SQL Anda secara signifikan. Berikut beberapa contohnya:

  • Gunakan Jinja untuk membuat variabel di file model:
{% set status = 'active' %}  -- Define a variable

SELECT *
FROM customers
WHERE status = {{ status }};
  • Definisikan variabel di file konfigurasi model menggunakan objek config.

Jika kita memiliki file models/model_properties.yml dan berisi field berikut:

# models/model_properties.yml
version: 2

models:
 - name: my_model
   config:
     target_schema: analytics

Kita dapat mengakses field-nya di dalam file .sql mana pun menggunakan Jinja:

{% set target_schema = config.target_schema %}

CREATE TABLE {{ target_schema }}.{{ target_table }} AS
...
  • Gunakan kondisional dan loop (ini kejutan yang menyenangkan!):

Kondisional:

{% if some_condition %}
 SELECT * FROM test_data
{% else %}
 SELECT * FROM production_data
{% endif %}

Loop:

SELECT
 order_id,
 {% for payment_method in ["bank_transfer", "credit_card", "gift_card"] %}
   SUM(CASE WHEN payment_method = '{{ payment_method }}' THEN amount END) AS {{ payment_method }}_amount,
 {% endfor %}
 SUM(amount) AS total_amount
FROM {{ ref('raw_payments') }}
GROUP BY 1;
  • Buat fungsi di SQL (macro) melalui Jinja (ya, benar):

Berikut macro-nya:

{% macro create_table(table_name, columns) %}
 CREATE TABLE {{ table_name }} (
   {% for column in columns %}
     {{ column.name }} {{ column.type }},
   {% endfor %}
 );
{% endmacro %}

Dan berikut cara menggunakannya di model:

{% call create_table('my_customer_table', [
   {'name': 'id', 'type': 'integer'},
   {'name': 'name', 'type': 'varchar(255)'},
   {'name': 'email', 'type': 'varchar(255)'},
]) %}

INSERT INTO {{ my_customer_table }} (id, name, email)
SELECT customer_id, customer_name, customer_email
FROM raw_customers;

Jika Anda ingin mempelajari lebih lanjut tentang penggunaan Jinja di dbt dengan SQL, lihat halaman ini dari dokumentasi dbt.

7. Pengujian di dbt

Seorang pengembang perangkat lunak yang baik tahu bahwa mereka perlu terus menguji kodenya untuk mencari bug dan error. Karena dbt menjadikan data engineer bak pengembang perangkat lunak, dbt menawarkan alur kerja langsung untuk menggunakan pengujian, baik bawaan maupun kustom.

Saat ini, dbt menawarkan empat pengujian bawaan berikut:

  • unique - memverifikasi semua nilai unik
  • not_null - memeriksa nilai hilang
  • accepted_values - memverifikasi semua nilai berada dalam daftar yang ditentukan, memiliki argumen values
  • relationships - memverifikasi koneksi ke tabel atau kolom tertentu, memiliki argumen to dan field

Untuk menentukan pengujian mana yang digunakan pada kolom mana, kita menggunakan file YAML bernama model_properties.yml di dalam direktori models.

Catatan: model_properties.yml bukan persyaratan agar model berjalan dan dapat diberi nama apa saja. Namun, jika Anda ingin membuat pengujian untuk memvalidasi data yang memasok model Anda melalui pengujian, file ini wajib ada.

Mari lihat cara menggunakan pengujian not_null untuk memeriksa nilai hilang di kolom cut pada tabel diamonds. Pertama, buat file model_properties.yml di dalam models:

$ touch models/model_properties.yml

Di dalamnya, tempelkan konten berikut:

version: 2

models:
 - name: average_diamond_price_per_group
   columns:
     - name: cut
       tests:
         - not_null

Pada field - name di bawah models, kita menentukan model mana yang kita definisikan propertinya. Lalu, kita tentukan kolom dan namanya. Terakhir, kita tulis field tests, di bawahnya kita cantumkan pengujian not_null.

Sekarang, Anda dapat menggunakan pengujian ini untuk melakukan validasi data sebelum menjalankan dbt run. Perintahnya adalah dbt test:

$ dbt test

Jika Anda menerima pesan error, artinya pengujian gagal dan Anda perlu memeriksa masalah pada tabel dan memperbaikinya jika perlu.

Alur Kerja dbt Tipikal yang Dapat Anda Ikuti

Untuk menggunakan dbt dengan sukses dalam proyek Anda, Anda dapat mengikuti alur kerja yang direkomendasikan ini:

1. Inisialisasi proyek

  • Instal dbt dan buat proyek baru dengan dbt init

2. Konfigurasi

  • Pilih platform basis data untuk proyek Anda
  • Konfigurasi kredensial basis data di profiles.yml di direktori home Anda.
  • Sesuaikan pengaturan proyek: Modifikasi dbt_project.yml untuk pengaturan tingkat proyek (misalnya, versi, dependensi).

3. Pengembangan

  • Tulis kode SQL model: Buat file .sql di direktori models untuk definisi model.
  • Tulis pengujian model: Buat file .yml di direktori tests untuk definisi pengujian.
  • Uji secara inkremental: Gunakan dbt test untuk sering menjalankan pengujian selama pengembangan.
  • Debug masalah: Gunakan dbt debug untuk pemecahan masalah.

4. Validasi Lokal (topik yang tidak kita bahas)

  • Build proyek: Gunakan dbt build untuk mengompilasi model dan pengujian.
  • Jalankan pengujian menyeluruh: Eksekusi semua pengujian menggunakan dbt test.

Praktik terbaik tambahan:

  • Kontrol versi: Gunakan Git untuk kolaborasi dan kontrol versi (ini wajib).
  • Dokumentasi: Tulis komentar yang mudah dibaca manusia di model dan pengujian. Anda dapat menggunakan dbt docs generate untuk merender dokumentasi model di server web (ya, ini mungkin) nantinya.
  • Profiling: Manfaatkan kapabilitas profiling dbt untuk menemukan dan memperbaiki bottleneck kinerja.
  • Continuous integration (CI): Integrasikan dbt dengan pipeline CI/CD untuk pengujian dan deployment otomatis.

Kesimpulan dan sumber daya lanjutan

Kita telah membahas banyak fundamental dalam tutorial ini, namun seperti yang saya sebutkan di awal, dbt adalah alat yang masif dengan banyak fitur. Butuh waktu untuk menguasainya hingga Anda nyaman menggunakannya di lingkungan produksi. Mengapa tidak menggunakan sumber-sumber ini untuk membantu Anda mencapai tujuan itu lebih cepat?


Bexruz (Bex) Tuychiev's photo
Author
Bexruz (Bex) Tuychiev
LinkedIn

Saya adalah kreator konten data science dengan pengalaman lebih dari 2 tahun dan salah satu dengan jumlah pengikut terbesar di Medium. Saya suka menulis artikel mendalam tentang AI dan ML dengan sedikit gaya sarkastik—karena harus ada sesuatu untuk membuatnya tidak terlalu membosankan. Saya telah menghasilkan lebih dari 130 artikel dan satu kursus di DataCamp, dengan satu lagi sedang dalam proses. Konten saya telah dilihat oleh lebih dari 5 juta pasang mata, dan 20 ribu di antaranya menjadi pengikut di Medium dan LinkedIn. 

Topik
Rekayasa Data

Mulai Perjalanan dbt Anda Hari Ini!

Kursus

Pengantar dbt

4 jam
34.2K
Kursus ini memperkenalkan dbt untuk pemodelan data, transformasi, pengujian, dan pembuatan dokumentasi.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya