DP-600 sınavında en ağır alan, yaklaşık yarı ağırlıkla veriyi hazırlamaktır. Power BI geliştiricisi için bu, Power Query’de yaptığın işin bir katman aşağıya, lakehouse ve ambara inmesi demektir. Bu ders “Microsoft Fabric’e giriş” dersinin devamıdır: orada parçaları tanıdın, burada onlarla Anadolu Market’in satış verisini temizleyip modele hazır hâle getireceksin. Yıldız şema, vekil anahtar ve SCD Tip 2 ayrıntıları “Fabric’te yıldız şema” dersinde; burada tekrar etmiyoruz.
Önce depoyu seç
| İhtiyaç | Depo | Neden? |
|---|---|---|
| Ham dosyalar (CSV, JSON) + Spark ile temizlik | Lakehouse | Dosyalar ve Delta tablolar bir arada; SQL analiz uç noktası salt okunur sorgu verir |
| T-SQL ile INSERT/UPDATE/MERGE, saklı yordamlar, SQL ekibi | Ambar (warehouse) | Tam okuma-yazma T-SQL |
| Saniyeler içinde gelen olay, log, tıklama verisi | Eventhouse (KQL veritabanı) | Zamana göre düzenlenmiş akış verisi; KQL ile sorgu |
Tipik düzen: ham veri lakehouse’ta, temizlenmiş ve modele hazır tablolar ambarda ya da yine lakehouse’ta. Gerçek zamanlı kısım “Gerçek zamanlı analitik” dersinde.
Ambarda T-SQL: görünüm, fonksiyon, saklı yordam
Fabric ambarı tablolar, görünümler, saklı yordamlar ve fonksiyonları destekler. Lakehouse’un SQL analiz uç noktasında da görünüm, fonksiyon ve yordam tanımlayabilirsin; ama orada tablo oluşturma, INSERT, UPDATE ve DELETE yoktur, çünkü tabloları Spark ya da veri akışı yazar.
Görünüm (view): Temizlik kuralını tek yerde tutar. Aşağıdaki görünüm iptalleri ayıklar, tutarı ondalık sayıya çevirir ve ürün kategorisini satırın yanına getirir:
CREATE VIEW dbo.vw_SatisTemiz AS
SELECT s.SiparisNo,
s.SatirNo,
CAST(s.Tarih AS date) AS Tarih,
s.MusteriNo,
s.UrunNo,
u.Kategori,
s.Kanal,
CAST(s.Tutar AS decimal(18, 2)) AS Tutar,
COALESCE(s.Indirim, 0) AS Indirim
FROM dbo.Satislar AS s
JOIN dbo.Urunler AS u ON u.UrunNo = s.UrunNo
WHERE s.Durum <> 'İptal';
Satır içi tablo değerli fonksiyon: Parametre alan bir görünüm gibi düşün. Örneğin tek bir kanalın satışlarını döndürür:
CREATE FUNCTION dbo.fn_KanalSatis (@Kanal varchar(20))
RETURNS TABLE
AS
RETURN
SELECT Tarih, Kategori, SUM(Tutar) AS Tutar
FROM dbo.vw_SatisTemiz
WHERE Kanal = @Kanal
GROUP BY Tarih, Kategori;
-- Kullanım
SELECT * FROM dbo.fn_KanalSatis('Web');
Saklı yordam (stored procedure): Birden çok adımı tek komutta toplar ve işlem hattından çağrılır. Bu yordam aylık özet tabloyu baştan kurar:
CREATE PROCEDURE dbo.usp_AylikOzetYenile
AS
BEGIN
DELETE FROM dbo.AylikKategoriOzet;
INSERT INTO dbo.AylikKategoriOzet (YilAy, Kategori, NetSatis, Adet)
SELECT FORMAT(Tarih, 'yyyy-MM'), Kategori, SUM(Tutar), COUNT(*)
FROM dbo.vw_SatisTemiz
GROUP BY FORMAT(Tarih, 'yyyy-MM'), Kategori;
END;
ALTER TABLE … ALTER COLUMN, düzenli ifade (regex) fonksiyonları ve birçok yapay zekâ fonksiyonu önizleme olarak işaretli. Tetikleyici (trigger), gerçekleştirilmiş görünüm (materialized view) ve özyinelemeli sorgu ambarda desteklenmiyor. MERGE ise genel kullanımda.Not defterinde PySpark ile temizlik
Hacim büyüyünce ya da mantık SQL’e sığmayınca not defteri (notebook) kullanılır. PySpark DataFrame’i, pandas’a benzer ama veriyi birçok makineye dağıtarak işler. Aşağıdaki hücre ham satış tablosunu okur, temizler ve Delta tablo olarak yazar:
from pyspark.sql import functions as F
ham = spark.read.table("ham_satislar")
temiz = (
ham
.dropDuplicates(["SiparisNo", "SatirNo"]) # yinelenen satırlar
.withColumn("Tutar", F.col("Tutar").cast("decimal(18,2)")) # tür dönüşümü
.withColumn("Tarih", F.to_date("Tarih", "dd.MM.yyyy"))
.withColumn("Kanal", F.trim(F.col("Kanal")))
.fillna({"Indirim": 0}) # eksik indirim = 0
.filter(F.col("Durum") != "İptal")
)
temiz.write.mode("overwrite").format("delta").saveAsTable("satislar_temiz")
| İş | PySpark | pandas | Power Query |
|---|---|---|---|
| Yinelenenleri kaldır | dropDuplicates([...]) | drop_duplicates(subset=[...]) | Yinelenenleri kaldır |
| Boşu doldur | fillna({...}) | fillna({...}) | Değerleri değiştir |
| Tür değiştir | cast("int") | astype("int") | Veri türü |
| Satır filtrele | filter(...) | df[df.Durum != "İptal"] | Satırları filtrele |
Küçük tablolarda Fabric’in Python (Spark’sız) not defterleri ve pandas yeterli olabilir; büyük tabloda Spark tercih edilir.
Görsel sorgu düzenleyici
SQL yazmak istemeyen kullanıcılar için ambarda ve SQL analiz uç noktasında görsel sorgu düzenleyici (visual query editor) var. Power Query’nin diyagram görünümünü kullanır: tabloları tuvale sürükler, “Sorguları yeni olarak birleştir” gibi adımlar eklersin.
- SQL’i görüntüle ile adımların T-SQL karşılığını görürsün.
- Görünüm olarak kaydet sonucu bir SQL görünümüne, Tablo olarak kaydet ise
CREATE TABLE AS SELECTile tabloya çevirir. - Yalnızca okuma (SELECT) yapar ve yalnızca katlanabilen (query folding) Power Query adımlarını sunar. Bir adım SQL’e çevrilemezse görünüm olarak kaydedilemez.
İşlem hatları: kopyala, çalıştır, zamanla
İşlem hattı (pipeline) adımları sıraya koyar. Anadolu Market’in gece hattı:
- Veri kopyala (Copy data) etkinliği: ERP’deki satış tablosunu lakehouse’un ham bölümüne taşır.
- Fabric not defteri etkinliği: yukarıdaki temizlik hücresini çalıştırır.
- Saklı yordam etkinliği:
usp_AylikOzetYenileçağrılır. - Anlam modeli yenileme etkinliği: modeli yeniler (Direct Lake’te çerçeveleme).
- Herhangi bir adım hata verirse Teams etkinliği ekibe mesaj atar; If condition ve ForEach ile koşul ve döngü kurulur.
Hat Zamanla düğmesiyle belirli aralıkta, Tetikleyici ile de bir olayda (ör. göle yeni dosya düştüğünde) çalışır. Yalnızca kaynaktan hedefe veri taşıyacaksan işlem hattı kurmadan Kopyalama işi (Copy job) da kullanılabilir; ilk çalışmada tam, sonra yalnızca yeni ve değişen satırları kopyalar.
Kirli veri: yinelenen, eksik, null ve tür
Temizliğe başlamadan önce ölç. Anadolu Market modelinde birkaç kontrol yapalım:
EVALUATE
ROW(
"Satır", COUNTROWS(Satislar),
"Farklı sipariş", DISTINCTCOUNT(Satislar[SiparisNo]),
"Farklı satır no", DISTINCTCOUNT(Satislar[SatirNo])
)
1.620 satır, 910 farklı sipariş, 1.620 farklı satır numarası. Yani bir siparişin birden çok satırı var (bu normal, tanecik sipariş satırı), ama anahtar olan satır numarası hiç tekrar etmiyor: yinelenen kayıt yok. Yinelenen kontrolü her zaman tablonun anahtarıyla yapılır.
Müşteri tablosunda ise 150 kayıt ve 140 farklı ad var. Bu yinelenme mi? Hayır: müşteri numaraları 150 farklı. Aynı adı taşıyan farklı kişiler var. Adı anahtar sanıp “yinelenenleri kaldır” dersen gerçek müşterileri silersin.
| Bulgu | Sayı | Karar |
|---|---|---|
Satislar[KargoGun] boş | 131 satır: 121’i iptal, 10’u hâlâ kargoda | Doldurma! Boşluk anlamlı: teslim olmamış sipariş. Ortalama kargo günü boşları zaten saymaz. |
Musteriler[Bolge] ve [Sehir] boş | 7 müşteri, 63.853 ₺ net satış | Silme; “Bilinmiyor” üyesine ata ve kaynağa geri bildir. |
| Ad tekrarı | 150 kayıt, 140 farklı ad | Yinelenme değil; anahtar MusteriNo. |
Tür dönüşümünde iki kural: tarihleri metin olarak bırakma (zaman zekâsı çalışmaz) ve para tutarını float yerine decimal tut (toplamlarda kuruş kayması olmasın). Dönüşüm hatasında satırı sessizce atmak yerine hatalı satırları ayrı bir tabloya yaz ve say.
Düzleştir ve önceden topla
Anlam modeli için iki hazırlık daha var:
- Düzleştirme (denormalize): Ürün → alt kategori → kategori zincirini tek ürün boyutuna indir. Modelde daha az ilişki, daha basit DAX.
- Önceden toplama (pre-aggregate): Yöneticiler yalnızca ay × kategori düzeyine bakıyorsa, milyonlarca satırı her sorguda toplamak yerine özet tabloyu ambarda hazırla (yukarıdaki saklı yordam). Modelde bu tabloyu toplama tablosu olarak kullanabilirsin (“Kurumsal model” dersi).
Özet tablonun doğru olup olmadığını DAX ile de kontrol edebilirsin. Ambarda GROUP BY ne yapıyorsa, DAX’ta SUMMARIZECOLUMNS aynısını yapar:
EVALUATE
SUMMARIZECOLUMNS(
Tarih[Yil],
Urunler[Kategori],
"Net Satış", [Net Satış],
"Adet", [Satılan Adet]
)
1.620 satış satırı, yıl × kategori düzeyinde 21 satıra iner. Ambardaki özet tablonun toplamları bu sorguyla aynı değilse, ya temizlik kuralı (iptaller) ya da tarih dönüşümü farklıdır.
OneLake kataloğu: veriyi bul, yönet, koru
Hazırladığın tabloyu başkalarının bulması gerekir. OneLake kataloğu (OneLake catalog), Fabric gezinti bölmesindeki OneLake simgesiyle açılır ve üç sekmeden oluşur:
- Keşfet (Explore): Lakehouse, ambar, anlam modeli gibi öğeleri ara, filtrele, ayrıntılarını gör. Desktop’ta bir modele bağlanırken de bu kataloğu kullanırsın.
- Yönet (Govern): Sahip olduğun verinin yönetişim sağlığı ve önerilen eylemler.
- Güvenlik (Secure): Çalışma alanı rolleri ve OneLake güvenlik rolleri tek ekranda.
Akış verisi için katalogun karşılığı Real-Time hub’dır; bir sonraki derste.