Het medallionpatroon is nuttig wanneer iedere laag een ander contract heeft. Het is niet nuttig wanneer een diagram gewoon drie kleuren nodig heeft.
- Bronze bewaart brongetrouwheid en historie.
- Silver valideert, dedupliceert, harmoniseert en verrijkt gedetailleerde data.
- Gold bedient een afgebakend zakelijk gebruik, zoals reporting, een applicatie of machine learning.
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
| Laag | Hoofdvraag | Typisch werk | Consumenten |
|---|---|---|---|
| Landing / ingestion | Kan ik opnieuw afspelen wat aankwam? | Bestanden, source metadata, arrival time en batch ID bewaren | Ingestion en operations |
| Bronze | Wat vertelde de bron ons? | Brongetrouwe records append-en met minimale verwerking | Engineering, audit, replay |
| Silver | Wat vinden we geldig? | Valideren, dedupliceren, harmoniseren, joinen, quarantine | Engineers, analysts, data scientists |
| Gold | Hoe moet de business dit gebruiken? | Modellen, aggregaties, KPI’s, serving optimization | Power 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:
- een Fabric-workspace;
- een Lakehouse;
- een raw CSV-bestand; en
- 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:
- records zonder amount worden uitgesloten van de geaccepteerde tabel;
- dates en amounts hebben stabiele types;
- derived columns hebben een gedocumenteerde betekenis; en
- de order grain blijft intact.
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:
- Validity: voldoet het record aan schema- en business rules?
- Uniqueness: is het nieuw, gecorrigeerd of gedupliceerd?
- Identity: naar welke business entity verwijst het?
- Consistency: zijn units, currencies, time zones en codes gelijkgetrokken?
- 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
| Grens | Doel | Voorbeelden | Afhandeling van failures |
|---|---|---|---|
| Landing naar Bronze | Replayability beschermen | Bestand leesbaar, verwachte kolommen, batch compleet | Payload bewaren; alert of quarantine |
| Bronze naar Silver | Geldigheid van records bepalen | Types, verplichte fields, ranges, duplicates, relationships | Accepted en rejected rows met redenen |
| Silver naar Gold | Businessbetekenis beschermen | Reconciliation, KPI rules, freshness, completeness | Publicatie blokkeren of markeren |
| Consumption | Gebruikerscontract beschermen | Measures, RLS, report totals, SLA checks | Product 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:
- een dataset voor een toezichthouder;
- een gecertificeerd cross-domainproduct;
- een applicatie- of API-contract;
- een point-in-time machine-learning feature set; of
- een partnerproduct met releaseproces.
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:
- aparte schema’s wanneer ownership wordt gedeeld;
- aparte Lakehouses wanneer lifecycle of access verschilt;
- aparte workspaces wanneer deployment, capacity of security verschilt; of
- een Lakehouse voor Bronze en Silver plus een Warehouse voor SQL-first Gold.
Kopieer geen data om alleen aan een diagram te voldoen. OneLake-shortcuts kunnen bestaande data zonder duplicatie ontsluiten.
Verder lezen
- Medallion architecture voor Fabric met OneLake begrijpen
- Wat is een Lakehouse in Microsoft Fabric?
- Medallion architecture implementeren met materialized lake views
- Wat is de medallion Lakehouse architecture?
- Delta Lake optimization en V-Order in Fabric
- Azure Databricks Unity Catalog-data in Fabric gebruiken met shortcuts
- Ontbrekende of verouderde Lakehouse-tabellen in het Fabric SQL endpoint oplossen
- Een 100% native Fabric analytics stack met dbt, Airflow, Lakehouse en Direct Lake
Veelvoorkomende valkuilen
- raw data transformeren voordat je die bewaart;
- business logic in de verkeerde laag verstoppen;
- rejected records verwijderen in plaats van meten;
- Silver te vroeg aggregeren;
- harmonisatie in ieder Gold-product herhalen;
- schema drift negeren;
- publiceren zonder reconciliation; en
- lagen toevoegen zonder eigen contract.
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.
Reacties laden…