Ana içeriğe geç
Kesit SQL
Orta · Veri Mühendisliği

ETL işletimi: hatalı satır tablosu, mükerrer kayıt ve yükleme günlüğü

Bir bozuk satır bütün yüklemeyi durdurmasın; ne okunduğu, ne yüklendiği ve ne reddedildiği hesapça tutsun.

Uygulamada aç, 10 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Gece yüklemesi neden yarıda kalır?

Kaynak dosyada bir satırın tutarı abc ise CAST hata verir ve bütün yükleme durur. Sabah rapor boştur, üstelik hangi satır yüzünden olduğunu kimse bilmez. İşletilen bir boru hattı üç şeyi ayırır: temiz satırlar yüklenir, bozuklar nedeniyle ayrı tabloya yazılır, her çalışma günlüğe bir satır bırakır.

Veri kurguduretl_ tabloları hayali bir gece yüklemesi için elle kuruldu. Gerçek bir sistemden alınmadı; bozuk satırlar bilerek kondu.
ÖnkoşulKatmanlar ve idempotent yükleme için ETL ve ELT dersine bak; burada tekrar anlatılmıyor.

Bozuk satırı ayıklamak: TRY_CONVERT

TRY_CONVERT dönüşemeyen değerde hata vermez, NULL döner. Bu yüzden bozuk satır bulmanın temel aracıdır. İki tuzak: boş metin INT için 0, DATE için 1900-01-01 olur, NULL dönmez; boşu ayrıca sına. 05.11.2024 gibi tarih de dil ayarına göre 5 Kasım ya da 11 Mayıs okunabilir; kaynağı yyyy-MM-dd ya da stil koduyla netleştir.

SELECT stg_id, kaynak_no, tutar, TRY_CONVERT(DECIMAL(12, 2), tutar) AS sayi, islem_tarihi, TRY_CONVERT(DATE, islem_tarihi) AS tarih
FROM etl_stg_hareket
ORDER BY stg_id;

Nedeniyle reddetmek

Red tablosu yalnız "bozuk" demez, neden yazar. Sabah ilk bakılan şey hangi nedenin arttığıdır.

INSERT INTO etl_red (stg_id, neden, batch_id)
SELECT stg_id,
       CASE WHEN hesap_no IS NULL THEN 'hesap bos'
            WHEN TRY_CONVERT(DATE, islem_tarihi) IS NULL THEN 'tarih bozuk'
            ELSE 'tutar bozuk' END,
       43
FROM etl_stg_hareket
WHERE hesap_no IS NULL
   OR TRY_CONVERT(DATE, islem_tarihi) IS NULL
   OR TRY_CONVERT(DECIMAL(12, 2), tutar) IS NULL;
SELECT neden, COUNT(*) AS satir FROM etl_red GROUP BY neden ORDER BY neden;

Mükerrer kayıt

Kaynak aynı kaydı iki kez gönderebilir. Hangi satırın kalacağı kurala bağlanır: burada temiz satırlar içinde kaynak_no başına en küçük stg_id. Önce süz, sonra numaralandır: K1015'in ilk kopyası bozuk, ikincisi temiz.

SELECT stg_id, kaynak_no, ROW_NUMBER() OVER (PARTITION BY kaynak_no ORDER BY stg_id) AS sira
FROM etl_stg_hareket
WHERE kaynak_no = 'K1007';

Yükleme günlüğü ve batch_id

Her çalışma batch_id alır. Fact ve red satırı bu numarayı taşır, böylece hatalı bir yüklemeyi yalnız o numarayla geri almak mümkün olur.

AlanNeden tutulur
okunan, yuklenen, reddedilen, mukerrerMutabakat: okunan = yüklenen + reddedilen + mükerrer olmalı. Tutmuyorsa satır kaybolmuştur.
baslangic, bitisSüre artışı sorunun erken işaretidir.
durumHata alan çalışma da satır bırakır; günlükte yoksa hiç başlamamış demektir.
ZamanlamaBu işi gece kim çalıştırır? SQL Server'da genellikle SQL Agent işi. Tarayıcıda zamanlayıcı yok; bak: SQL Agent ve iş geçmişi dersi.

Sıra önemli

Red kaydı yüklemeden önce yazılır, fact yüklemesi de reddedilenleri dışlar. Tersi yapılırsa bozuk satır CAST hatasıyla her şeyi durdurur. Aynı batch yeniden çalışırsa önce o batch'in satırları silinir: yeniden çalıştırmak çift satır üretmemeli.

Alıştırmalara geç (10)