Modül 5 · Analitik Mühendisliği (dbt) · ⏱ 7 dk

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

Özellikdbt Coredbt Cloud
FiyatÜcretsiz (BSD-3)Ücretsiz tier var (1 dev), sonra $100/dev/ay
Çalışma yeriSenin makinen / Docker / CIdbt Labs’in SaaS’ı
SchedulerYOK (kendi cron/CI ile yönet)Built-in (UI’dan ayarla)
CI/CDKendin kurBuilt-in (PR’da otomatik dbt build)
IDEVS Code extensionWeb + VS Code
Metadata APIYok (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

  1. dbt init ile proje aç, profiles.yml’i düzenle, dbt debug ile bağlantıyı doğrula.
  2. fct_gunluk_siparis modelini ekle, dbt run çalıştır, BigQuery konsolunda tabloyu incele.
  3. Materialization’ı view’e çevir, dbt run tekrar — bu sefer tablo oluşmaz, sorgu her defasında çalışır.

Sıradaki

Sources, seeds, tests, docs: modelin kalite ve dokümantasyon katmanı →