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

Macros & Packages

Macros and Packages

Bu derste neler öğreneceksin

  • Jinja macro yazar
  • dbt_utils paketi kullanır
  • Topluluk paketlerini keşfeder

Tarifleri Tekrar Tekrar Yazma

Annen her çorba tarifinin altına “tuz ve karabiber ekle” yazmıyor — bunlar ortak adımlar. “Çorba tarifi”nin sonuna “baharat ekle” diye küçük bir not düşüyor, her tarifte uyguluyor.

dbt’de macro = ortak SQL parçası. Bir kez yazarsın, yüz modelde çağırırsın. Macro dili Jinja — süslü parantez {{ }} ve yüzde {% %} ile yazılır.

İlk Macro: “tarihi düzgün göster”

macros/tarih_formatla.sql:

{% macro tarih_formatla(alan) %}
  CAST({{ alan }} AS DATE FORMAT 'YYYY-MM-DD')
{% endmacro %}

Şimdi bir modelde kullan:

{{ tarih_formatla('siparis_tarihi') }} AS siparis_gunu

dbt bunu derlerken:

CAST(siparis_tarihi AS DATE FORMAT 'YYYY-MM-DD') AS siparis_gunu

olarak değiştirir. Yarın formatı DD/MM/YYYY yapmak istersen macro’yu bir yerde değiştirirsin, 50 modele yeniden dokunmazsın.

Macro İçinden Macro Çağırmak

Macroların içinde başka makroları çağırabilirsin:

{% macro haftalik_ozet(tablo) %}
  SELECT
    DATE_TRUNC({{ tarih_formatla(tablo) }}.tarih, WEEK) AS hafta,
    COUNT(*) AS kayit_sayisi
  FROM {{ tablo }}
  GROUP BY 1
{% endmacro %}

Packages: “Komşunun Tarif Defteri”

Annen bazen komşudan tarif ödünç alır: “Komşu Hanım’ın browni tarifi harika!” Aynı şekilde dbt dünyasında insanlar paket yayınlar: hazır macro’lar, hazır testler, hazır modeller.

En ünlü paket: dbt_utils. İçinde 100+ yararlı macro var.

Paket Kur

packages.yml:

packages:
  - package: dbt-labs/dbt_utils
    version: [">=1.0.0", "<2.0.0"]

Sonra:

dbt deps

dbt_utils paketi indirilir, dbt_packages/ klasörüne kurulur. Artık projende dbt_utils.surrogate_key, dbt_utils.date_spine, dbt_utils.pivot gibi makroları kullanabilirsin.

Örnek: surrogate_key

Birden fazla sütunu birleştirip benzersiz kimlik üretmek için:

SELECT
  {{ dbt_utils.surrogate_key(['musteri_id', 'siparis_tarihi']) }} AS musteri_gun_id,
  musteri_id,
  SUM(toplam_tutar) AS gunluk_toplam
FROM {{ source('raw', 'siparisler') }}
GROUP BY 1, 2

surrogate_key arka planda md5(musteri_id || '-' || siparis_tarihi) üretir. Aynı müşteri + aynı gün hep aynı ID çıkar.

Örnek: pivot

Satır -> sütun dönüşümü için:

{{ dbt_utils.pivot(
    'icecek_turu',
    dbt_utils.get_column_values(table=ref('gunluk_siparis'), column='icecek_turu')
) }}

Bu, “her içecek türü kendi sütunu olsun” demek.

Başka Paketler

  • dbt_expectations: 50+ gelişmiş test (expect_column_values_to_be_between, expect_row_values_to_have_repeats gibi).
  • codegen: YAML şema dosyalarını otomatik üretir.
  • audit_helper: İki modelin çıktısını karşılaştırır.
  • dbt_project_evaluator: Projenin sağlığını denetler.

Ne Öğrendik?

  • Macro = tekrar eden SQL parçasını bir kez yazıp yüz modelde çağırmak. Jinja dilinde yazılır.
  • Package = başkalarının hazır macro’ları. packages.yml’e ekle, dbt deps çalıştır.
  • En yaygın paket dbt_utils: surrogate_key, pivot, date_spine ve daha fazlası.

Küçük Ödev

  1. macros/tarih_formatla.sql macro’sunu yaz ve bir modelde kullan.
  2. dbt_utils.surrogate_key ile musteri_gun_id üreten bir model yaz.
  3. dbt deps + dbt run çalıştır, hatasız tamamlanmalı.

Sıradaki

Pencere fonksiyonları ve CTE: “her müşterinin en son siparişi”ni bul →