ETL Süreçleriyle Ham Veriden Güvenilir Veri Boru Hatlarına

Bir e-ticaret şirketinde siparişler PostgreSQL’de, reklam verileri bir API’de, müşteri yorumları JSON dosyalarında tutulabilir. Analiz ekibinin bütün bunları tek tek toplaması hem zaman kaybettirir hem de hata üretir. ETL süreçleri, dağınık ham veriyi otomatik biçimde çekip temizleyerek analiz edilmeye hazır, güvenilir bir veri kaynağına dönüştürür.

``

ETL nedir?

ETL; Extract, Transform, Load kelimelerinin baş harflerinden oluşur. Bir veri boru hattı ise verinin kaynaktan hedefe düzenli, izlenebilir ve mümkünse hatalara dayanıklı biçimde akmasını sağlayan daha geniş otomasyon sistemidir.

Aşama Temel soru Örnek işlem
Extract Veri nereden alınacak? API, veritabanı veya CSV okuma
Transform Veri nasıl kullanılabilir hâle gelecek? Temizleme, birleştirme, doğrulama
Load Veri nereye yazılacak? Veri ambarına veya data lake’e yükleme

1. Extract: Veriyi kaynağından çekmek

Çıkarma aşamasında ilişkisel veritabanları, uygulama günlükleri, sensörler, bulut depoları ve harici API’ler gibi farklı kaynaklara bağlanılır. Buradaki önemli karar, verinin tamamının mı yoksa yalnızca değişen bölümünün mü alınacağıdır.

Tam yükte her çalıştırmada $N$ kayıt okunur. Artımlı yükte yalnızca değişen $\Delta N$ kayıt işlenir. Genellikle $\Delta N \ll N$ olduğundan artımlı yaklaşım ağ ve işlem maliyetini ciddi ölçüde azaltır. Bunun için zaman damgası, artan kimlik veya CDC (Change Data Capture) kullanılabilir.

2. Transform: Ham veriyi anlamlı hâle getirmek

Dönüştürme, ETL’in mutfağıdır. Eksik alanlar ele alınır, tarih biçimleri standartlaştırılır, tekrar eden kayıtlar silinir ve iş kuralları uygulanır. Örneğin toplam sipariş geliri şu şekilde hesaplanabilir:

\[Gelir = \sum_{i=1}^{n} adet_i \times birim\_fiyat_i\]

Ancak matematik doğru olsa bile para birimleri farklıysa sonuç yanıltıcıdır. Bu nedenle dönüşüm yalnızca kod yazmak değil, verinin iş bağlamını anlamaktır.

import pandas as pd

def transform_orders(df: pd.DataFrame) -> pd.DataFrame:
    # Kimliği olmayan kayıtlar güvenilir biçimde eşleştirilemez.
    df = df.dropna(subset=["order_id"])
    df = df.drop_duplicates(subset=["order_id"])

    # Farklı tarih gösterimlerini ortak tipe dönüştürür.
    df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce")
    df["total_amount"] = df["quantity"] * df["unit_price"]

    # Geçersiz veya negatif tutarları dışarıda bırakır.
    return df[df["total_amount"] >= 0]

Bu fonksiyon temel temizlik, tip dönüşümü ve gelir hesaplamasını tek adımda gerçekleştirir. Gerçek sistemlerde kurallar testlerle desteklenmelidir.

3. Load: Sonucu hedefe taşımak

Temizlenen veri; Snowflake, BigQuery, Redshift gibi veri ambarlarına veya bir data lake’e yüklenebilir. Yükleme tam yenileme, ekleme ya da upsert yöntemiyle yapılabilir. Upsert, mevcut kaydı günceller; yoksa yeni kayıt ekler.

Yaklaşım Avantaj Dezavantaj
Batch Basit ve ekonomik Veri gecikmeli gelir
Streaming Düşük gecikme İşletmesi daha karmaşıktır
ETL Hedefe temiz veri gider Dönüşüm altyapısı gerekir
ELT Ham veri korunur, esnektir Güçlü hedef sistem ister

Sağlam bir pipeline nasıl tasarlanır?

İyi bir veri boru hattı yalnızca başarılı durumda çalışmamalıdır. Aynı işlem tekrar çalıştırıldığında sonucu bozmayan idempotent adımlar tasarlanmalı; başarısız kayıtlar ayrı bir hata kuyruğuna gönderilmelidir. Loglama, veri kalite kontrolleri, şema doğrulama ve uyarılar da sistemin vazgeçilmez parçalarıdır.

Airflow, Dagster veya Prefect görevlerin sırasını ve zamanlamasını yönetebilir. Kafka gerçek zamanlı veri akışında, dbt ise SQL tabanlı dönüşümlerde öne çıkar. Araç seçiminden önce veri hacmi, gecikme beklentisi, maliyet ve ekip deneyimi değerlendirilmelidir.

Sonuç olarak ETL, veriyi A noktasından B noktasına taşıyan basit bir kargo hizmeti değildir. Kaynakları uzlaştıran, kaliteyi koruyan ve analitik kararların güvenilir temelini oluşturan otomatik bir üretim hattıdır. Boru hattı görünmez çalıştığında herkes mutludur; durduğunda ise neden veri mühendislerine ihtiyaç duyulduğu hemen anlaşılır!

Yorumlar