dbt: tarif defteri
dbt cookbook
Bu derste neler öğreneceksin
- dbt Core vs dbt Cloud farkını bilir
- dbt init ile proje oluşturur
- İlk model yazar
dbt Nedir ve Neden Bu Kadar Popüler?
Modern veri stack’inde ELT (Extract-Load-Transform) prensibi: ham veriyi önce warehouse’a yükle (BigQuery, Snowflake, Postgres), sonra SQL ile dönüştür. İşte bu dönüşüm katmanını standart hale getiren araç dbt (data build tool). Bir CLI + bir Jinja-templated SQL motoru + bir test/docs çerçevesi.
dbt öncesi durum: SQL sorguları bir klasörde dağınık .sql dosyaları, kim ne zaman değiştirdi belli değil, test yok, dokümantasyon yok. dbt sonrası: her sorgu versiyonlanmış bir “model”, testleri var, dokümantasyonu otomatik, lineage (köken) grafiği otomatik çıkıyor.
2026’da dbt de facto standart. Analytics engineer rolü dbt ile yazılan SQL olarak tanımlanıyor. Kariyer için bilmek şart.
dbt Core vs dbt Cloud
| Özellik | dbt Core | dbt Cloud |
|---|---|---|
| Fiyat | Ücretsiz (BSD-3) | Ücretsiz tier var (1 dev), sonra $100/dev/ay |
| Çalışma yeri | Senin makinen / Docker / CI | dbt Labs’in SaaS’ı |
| Scheduler | YOK (kendi cron/CI ile yönet) | Built-in (UI’dan ayarla) |
| CI/CD | Kendin kur | Built-in (PR’da otomatik dbt build) |
| IDE | VS Code extension | Web + VS Code |
| Metadata API | Yok (kendin JSON parse et) | Built-in |
Ne zaman Core? Lokal geliştirme, kendi CI’ınla (GitHub Actions), self-hosted scheduler istiyorsan. Ne zaman Cloud? Takım halinde çalışıyorsan, scheduler istemiyorsan, hızlı başlangıç istiyorsan.
Çoğu şirket ikiyi birlikte kullanır: Core ile local geliştirme, Cloud ile production schedule.
Proje Oluştur
pip install dbt-core dbt-bigquery
dbt init limonata_analiz
# sorular: adapter=bigquery, project=my-limonata-lab, dataset=analytics, threads=4
Çıkan yapı:
limonata_analiz/
├── analyses/ # tek seferlik keşif sorguları
├── models/
│ ├── staging/ # ham veri temizleme (1:1 source)
│ ├── intermediate/ # ara dönüşümler (opsiyonel)
│ └── marts/ # iş tabloları (dim, fact)
├── seeds/ # küçük CSV'ler
├── snapshots/ # slowly changing dimensions (SCD)
├── macros/ # Jinja makrolar
├── tests/ # custom singular testler
├── dbt_project.yml # proje ayarları
├── packages.yml # paketler
└── profiles.yml # bağlantı (gizli)
profiles.yml .gitignore’a eklenir (credential içerir). Production’da environment variable kullanılır.
İlk Model: Mart Layer
models/marts/fct_gunluk_siparis.sql:
{{ config(
materialized='table',
partition_by={'field': 'siparis_gunu', 'data_type': 'date'},
cluster_by=['musteri_id']
) }}
SELECT
DATE(siparis_tarihi) AS siparis_gunu,
musteri_id,
COUNT(DISTINCT siparis_id) AS siparis_sayisi,
SUM(toplam_tutar) AS brut_ciro,
SUM(toplam_tutar - indirim) AS net_ciro
FROM {{ source('raw', 'siparisler') }}
WHERE siparis_tarihi >= '2024-01-01'
GROUP BY 1, 2
{{ config(...) }} bloğunda:
materialized='table': Sorgu sonucu fiziksel tablo olarak yazılır. Alternatif:view(her seferinde sorguyu çalıştırır),incremental(sadece yeni satırları ekler),ephemeral(CTE gibi — fiziksel yazılmaz).partition_by: BigQuery’de sorgu maliyetini düşürür, sadece ilgili günleri okur.cluster_by: Sık filtrelenen sütuna göre fiziksel sıralama.
Çalıştır
dbt run --select fct_gunluk_siparis
# 1 of 1 PASS ...
dbt run --select tag:gunluk # tag'li tüm modeller
dbt run --select +fct_gunluk_siparis # bu model + upstream bağımlılıkları
dbt build # run + test + snapshot + seed, hepsi birden
dbt build production’da kullanılacak tek komut: önce modelleri çalıştırır, sonra testleri, hepsi geçerse build başarılı.
Ne Öğrendik?
- dbt SQL-tabanlı veri dönüşümünü standart hale getiren araçtır.
- Core (CLI, ücretsiz) ve Cloud (SaaS, ücretsiz tier) iki dağıtım modeli.
- Proje yapısı: staging (1:1 source), marts (iş tabloları), intermediate (opsiyonel).
- Materialization stratejileri:
view,table,incremental,ephemeral. {{ config() }}ile model başına warehouse-specific optimizasyon yapılır.
Küçük Ödev
dbt initile proje aç,profiles.yml’i düzenle,dbt debugile bağlantıyı doğrula.fct_gunluk_siparismodelini ekle,dbt runçalıştır, BigQuery konsolunda tabloyu incele.- Materialization’ı
view’e çevir,dbt runtekrar — bu sefer tablo oluşmaz, sorgu her defasında çalışır.
Sıradaki
Sources, seeds, tests, docs: modelin kalite ve dokümantasyon katmanı →