Ga naar de inhoud
R Roesli.
Ga terug
lakehouse

Bouw een medallion Lakehouse in Microsoft Fabric van raw tot gold

Een praktische en architecturale gids voor Bronze, Silver, Gold, datakwaliteit, harmonisatie en optionele serving layers in een Fabric Lakehouse.

Het medallionpatroon is nuttig wanneer iedere laag een ander contract heeft. Het is niet nuttig wanneer een diagram gewoon drie kleuren nodig heeft.

Deze walkthrough gebruikt een Fabric trial-workspace en een kleine orderset. De folder Files/raw is een grens voor landing en replay, geen vierde kwaliteitslaag. Bronze is de duurzame Delta-representatie van die input.

De contracten

LaagHoofdvraagTypisch werkConsumenten
Landing / ingestionKan ik opnieuw afspelen wat aankwam?Bestanden, source metadata, arrival time en batch ID bewarenIngestion en operations
BronzeWat vertelde de bron ons?Brongetrouwe records append-en met minimale verwerkingEngineering, audit, replay
SilverWat vinden we geldig?Valideren, dedupliceren, harmoniseren, joinen, quarantineEngineers, analysts, data scientists
GoldHoe moet de business dit gebruiken?Modellen, aggregaties, KPI’s, serving optimizationPower BI, applicaties, businessteams

Iedere grens moet ownership, kwaliteit, herstel, toegang of performance verduidelijken. Anders is de laag architecture theatre.

Wat we bouwen

landing/raw_orders.csv
        |
        v
bronze_orders
        |
        v
silver_orders
        |
        v
gold_orders_by_region

Vereisten

Je hebt nodig:

  1. een Fabric-workspace;
  2. een Lakehouse;
  3. een raw CSV-bestand; en
  4. een notebook met PySpark.

1. Maak de workspace en het Lakehouse

Maak:

blog_lakehouse_medallion
sales_lakehouse

Maak voor deze walkthrough:

Files/raw/

Managed Delta tables staan onder Tables; bijpassende folders Files/bronze, Files/silver en Files/gold zijn niet nodig. Grotere ontwerpen kunnen aparte schema’s, Lakehouses of workspaces gebruiken wanneer ownership of security dat vereist.

2. Laad de raw data

Upload:

order_id,customer_id,order_date,amount,status,region
1001,501,2026-09-14,124.90,paid,North
1002,502,2026-09-15,80.00,paid,South
1003,503,2026-09-16,210.75,fulfilled,North
1004,504,2026-09-17,52.10,returned,West

Sla dit op als:

Files/raw/orders.csv

Lees het:

from pyspark.sql import functions as F

raw_df = spark.read.option("header", True).option("inferSchema", True).csv("Files/raw/orders.csv")
raw_df.show(10)

Laat deze landing copy ongewijzigd, zodat de transformatielogica opnieuw kan worden afgespeeld.

3. Maak Bronze

De compacte tutorial past technische normalisatie toe:

bronze_df = (
    raw_df
    .withColumnRenamed("order_id", "order_id")
    .withColumnRenamed("customer_id", "customer_id")
    .withColumn("order_date", F.to_date(F.col("order_date")))
    .withColumn("status", F.lower(F.trim(F.col("status"))))
    .withColumn("amount", F.col("amount").cast("decimal(18,2)"))
    .na.fill({
        "region": "Unknown",
        "status": "unknown"
    })
)

bronze_df.write.mode("overwrite").format("delta").saveAsTable("bronze_orders")

Voor striktere brongetrouwheid gebruik je append in plaats van overwrite en voeg je source file, ingestion timestamp, batch ID en source-system metadata toe. Verplaats opschoning van waarden naar Silver.

4. Maak Silver

Silver moet de laagste bruikbare business grain behouden. In dit voorbeeld blijft één gedetailleerde rij per order staan en geldt een klein contract:

silver_df = (
    spark.table("bronze_orders")
    .filter(F.col("amount").isNotNull())
    .withColumn("net_amount", F.col("amount"))
    .withColumn("order_month", F.date_format(F.col("order_date"), "yyyy-MM"))
    .withColumn("is_paid", F.when(F.col("status") == "paid", 1).otherwise(0))
)

silver_df.write.mode("overwrite").format("delta").saveAsTable("silver_orders")

Productioncode hoort ongeldige rijen niet stil te verliezen. Schrijf ze naar silver_orders_quarantine met quality_rule, quality_reason, source_batch_id en quarantined_at.

5. Publiceer Gold

Gold is een consumentencontract. Het moet een businessvraag beantwoorden, geen bronopschoning herhalen. Eén Silver-tabel kan meerdere Gold-producten voeden met verschillende measures of grains.

gold_df = (
    spark.table("silver_orders")
    .groupBy("region", "order_month")
    .agg(
        F.sum("net_amount").alias("total_revenue"),
        F.count("order_id").alias("order_count"),
        F.sum("is_paid").alias("paid_orders")
    )
    .orderBy("order_month", "region")
)

gold_df.write.mode("overwrite").format("delta").saveAsTable("gold_orders_by_region")

Voor grotere reportingsolutions bevat Gold meestal fact- en dimensiontabellen op bruikbare grains. Een semantic model kan daarna relationships, measures en gebruikersgerichte terminologie beheren.

6. Valideer de lagen

spark.sql("SHOW TABLES").show(truncate=False)
spark.sql("SELECT * FROM gold_orders_by_region ORDER BY order_month, region").show(50, truncate=False)

De controles moeten ook aantallen accepted, rejected, corrected en late records vastleggen. Dat zijn operationele metrics, geen tijdelijke notebookoutput.

Waarom Silver bestaat

In Silver worden sourcerecords betrouwbare domainrecords. De laag neemt beslissingen over:

  1. Validity: voldoet het record aan schema- en business rules?
  2. Uniqueness: is het nieuw, gecorrigeerd of gedupliceerd?
  3. Identity: naar welke business entity verwijst het?
  4. Consistency: zijn units, currencies, time zones en codes gelijkgetrokken?
  5. History: hoe worden late updates, deletions en changing dimensions verwerkt?

Als ieder Gold-product die beslissingen herhaalt, heeft de organisatie meerdere definities van trusted data.

Zet quality checks op de grens

GrensDoelVoorbeeldenAfhandeling van failures
Landing naar BronzeReplayability beschermenBestand leesbaar, verwachte kolommen, batch compleetPayload bewaren; alert of quarantine
Bronze naar SilverGeldigheid van records bepalenTypes, verplichte fields, ranges, duplicates, relationshipsAccepted en rejected rows met redenen
Silver naar GoldBusinessbetekenis beschermenReconciliation, KPI rules, freshness, completenessPublicatie blokkeren of markeren
ConsumptionGebruikerscontract beschermenMeasures, RLS, report totals, SLA checksProduct owner waarschuwen

Controleer voor orders dat order_id aanwezig en uniek is, customer_id resolved, amount niet negatief is, dates aannemelijk zijn, status canonical is en accepted plus rejected rows aansluiten op Bronze.

Harmonisatie hoort vooral in Silver

ERP-, e-commerce- en marketplacesources kunnen verschillen in customer IDs, product codes, statuses, currencies, units, time zones en region names. Silver vertaalt die variaties naar canonical keys en vocabularies via crosswalks, reference data, master-data matching of survivorship rules.

Bewaar source keys en originele codes naast canonical values. Gold kan dan consumentenspecifieke interpretaties toepassen zonder traceability te verliezen.

Heb je een Platinum-laag nodig?

Meestal niet. Platinum hoort niet bij het standaardpatroon Bronze-Silver-Gold. Voeg alleen een extra serving tier toe als die een eigen contract, owner, security boundary of operationele eis heeft, zoals:

Namen als certified, serving, regulatory of features zijn soms duidelijker dan platinum. Kun je de extra owner en het contract niet uitleggen, dan is Gold waarschijnlijk genoeg.

Eén Lakehouse of meerdere?

Deze tutorial houdt alles bij elkaar voor de duidelijkheid. Production kan werken met:

Kopieer geen data om alleen aan een diagram te voldoen. OneLake-shortcuts kunnen bestaande data zonder duplicatie ontsluiten.

Verder lezen

Veelvoorkomende valkuilen

De kern

Een medallion Lakehouse is een data operating model:

preserve -> validate and harmonize -> publish for a consumer

Houd Bronze replayable, maak Silver betrouwbaar op bruikbaar detailniveau, maak Gold expliciet over de consument en voeg alleen een laag toe wanneer het contract echt anders is.


Deel deze post:

Lees verder

Vorige post
Ontbrekende of verouderde Lakehouse-tabellen in het Fabric SQL endpoint oplossen
Volgende post
Plan Microsoft Fabric-capacity vanuit workloadpatronen
Community

Praat mee

Meld je aan met GitHub om een reactie achter te laten.

GitHub

Reacties laden…

Meld je aan met GitHub om te reageren