đĄLakehouse (ou comment visualiser 10 milliards de donnĂ©es)
Du CSV brut au Dashboard Power BI â Guide complet pour une mise en production industrialisĂ©e
Du CSV brut au Dashboard Power BI â Guide complet pour une mise en production industrialisĂ©e

Une architecture pensĂ©e pour lâĂ©volutivitĂ©, la qualitĂ© des donnĂ©es et lâexploitation temps-rĂ©el
Dans cet article, je souhaite vous partager pourquoi une architecture Lakehouse Fabric en trois temps (Bronze â Silver â Gold) est, selon moi, le meilleur compromis entre agilitĂ© et gouvernance pour transformer nâimporte quel fichier CSV en table de bord Power BI en production â et ce, sans copier vos donnĂ©es ni sacrifier la traçabilitĂ©. AprĂšs avoir accompagnĂ© plusieurs Ă©quipes sur des plateformes de plusieurs pĂ©ta-octets, jâai vu trop de projets Ă©chouer faute dâun socle clair : ingestion brute, transformations rĂ©versibles et exposition instantanĂ©e. Ce guide condense lâapproche que jâutilise aujourdâhui : un Copy Job sans transformation pour le mĂ©daillon Bronze, un notebook PySpark rĂ©utilisable pour la Silver, et un modĂšle Ă©toile Delta accessible en temps rĂ©el via DirectLake. Si vous cherchez Ă industrialiser vos donnĂ©es tout en gardant la main sur la qualitĂ©, ce rĂ©cit est pour vous.
Qui suis-je ? Architecte, ingénieur, CTO, j'accompagne les entreprises à mettre en production des systÚmes Data & IA à grande échelle.

đ Contexte du projet
Dans le cadre de la modernisation d'une plateforme client, j'ai conçu et intĂ©grer une architecture Fabric Lakehouse suivant les principes medallion (Bronze â Silver â Gold). Cette architecture permet dâindustrialiser le traitement des donnĂ©es tout en garantissant traçabilitĂ©, qualitĂ© et performance.
đ Arborescence complĂšte du projet
đ§± Workspace Fabric : ws-prod
ws-prod/
âââ Lakehouses/
â âââ lh-prod/
â âââ Files/
â â âââ 1-BRNZ/ â Bronze : donnĂ©es brutes
â â â âââ public.product/
â â â â âââ _delta_log/
â â â â âââ part-*.parquet
â â â âââ public.customer/
â â âââ 2-SLV/ â Silver : donnĂ©es nettoyĂ©es
â â â âââ product_clean/
â â â âââ customer_clean/
â â âââ 3-GOLD/ â Gold : modĂšle Ă©toile
â â âââ fact_sales/
â â âââ dim_product/
â â âââ dim_customer/
â â âââ dim_date/
â âââ Tables/ â Tables enregistrĂ©es
â âââ SQL Analytics Endpoint/ â Connexion BI
âââ Notebooks/
â âââ nb_bronze_to_silver.py â Transformation Silver
â âââ nb_silver_to_gold.py â ModĂ©lisation Gold
â âââ nb_data_quality.py â Tests qualitĂ©
âââ Pipelines/
â âââ pl_bronze_ingestion â Copy Job â Bronze
â âââ pl_silver_transformation â Bronze â Silver
â âââ pl_gold_modelisation â Silver â Gold
âââ Data Factory/
â âââ Copy Jobs/
â âââ cj_vehicle_csv_to_delta â Ingestion sans transformation
âââ Power BI/
âââ Sales Dashboard.pbix â Dataset DirectLake
Flux de données détaillé
Phase 1 : Ingestion Bronze (Zero-ETL)
Objectif : Capturer les données sources sans transformation pour garantir une archive fidÚle, profiter des copy jobs et éviter les charges.
Configuration du Copy Job
{
"source": {
"type": "DelimitedText",
"fileName": "public.vehicle.csv",
"location": "ADLS Gen2"
},
"destination": {
"type": "Lakehouse",
"folderPath": "Files/1-BRNZ/product.vehicle",
"format": "delta",
"writeMode": "overwrite"
},
"settings": {
"firstRowAsHeader": true,
"compression": "snappy"
}
}
Avantages de cette approche
- Traçabilité complÚte : conservation de l'intégralité des données sources
- Rejeu possible : en cas d'erreur de transformation, on peut retraiter depuis Bronze
- Auditabilité : conformité réglementaire (RGPD, SOX...)
Phase 2 : Transformation Silver (Notebook PySpark)
Objectif : Nettoyer, standardiser et enrichir les données.
Notebook nb_bronze_to_silver.py
# Lecture Bronze
df_bronze = spark.read.format("delta").load("Files/1-BRNZ/public.product")
# Transformation Silver
df_silver = (df_bronze
.filter(col("product_id").isNotNull())
.withColumn("registration_date", to_date("registration_date", "yyyy-MM-dd"))
.withColumn("engine_power_kw", col("engine_power_hp") * 0.7457)
.dropDuplicates(["product_id"])
.withColumn("processed_at", current_timestamp())
)
# Ăcriture Silver avec partitionnement
df_silver.write \
.format("delta") \
.mode("overwrite") \
.option("mergeSchema", "true") \
.partitionBy("year", "month") \
.save("Files/2-SLV/product_clean")
Phase 3 : Modélisation Gold (ModÚle étoile)
Objectif : Structurer les données pour l'analyse multidimensionnelle.
Notebook nb_silver_to_gold.py
# Tables dimension
dim_vehicle = df_silver.select(
"product_id", "brand", "model", "year", "engine_type"
).distinct()
dim_date = spark.sql("""
SELECT DISTINCT
registration_date as date_key,
year(registration_date) as year,
month(registration_date) as month,
dayofweek(registration_date) as weekday
FROM product_clean
""")
# Table de faits
fact_sales = df_silver.select(
"product_id",
"registration_date",
"sale_price",
"margin"
)
# Sauvegarde Gold avec optimisation BI
(fact_sales.write
.format("delta")
.mode("overwrite")
.option("delta.enableChangeDataFeed", "true")
.save("Files/3-GOLD/fact_sales"))
đŻ Orchestration via Pipeline
Pourquoi orchestrer ?
- Gestion des dépendances : Silver ne démarre que si Bronze est OK
- Déclencheurs Batch / Quotidien - Hebdos...
- Surveillance : alertes en cas d'échec
- Reprise sur erreur : retry automatique
- Audit temporel : logs détaillés
Pipeline pl_full_load

đ Format Delta : Pourquoi c'est critique
Propriétés ACID garanties
Propriété | Implémentation Delta | Bénéfice |
---|---|---|
Atomicity | Transaction log _delta_log |
Pas de données partielles |
Consistency | Validation du schĂ©ma | Ăvite la corruption |
Isolation | Optimistic concurrency | Traitements parallÚles sûrs |
Durability | Ăcriture sur storage persistant | Pas de perte de donnĂ©es |
Fonctionnalités avancées
Pour aller plus loin, certaines fonctionnalitĂ©s exclusives aux formats ouverts (open formats) offrent des avantages significatifs. Câest notamment le cas de la fonctionnalitĂ© "Snapshot", qui permet de consulter une version antĂ©rieure dâune table Ă une date donnĂ©e. Cela peut sâavĂ©rer particuliĂšrement utile pour les tables de faits (fact tables), oĂč il est parfois nĂ©cessaire de reconstituer lâĂ©tat des donnĂ©es Ă un moment prĂ©cis du passĂ©. Par exemple, afficher la table "Sales" telle quâelle Ă©tait le 18 juillet 2023 peut se faire simplement Ă lâaide dâune requĂȘte SELECT
avec une clause WHERE
appropriée.
# Time travel - rollback possible
df_20240101 = spark.read \
.option("timestampAsOf", "2024-01-01") \
.format("delta").load("Files/2-SLV/vehicle_clean")
# Streaming + batch unifié
df_stream = spark.readStream \
.format("delta") \
.load("Files/1-BRNZ/public.vehicle")
đ Exploitation des donnĂ©es
AccĂšs multi-couches
Couche | AccĂšs | Usage |
---|---|---|
Bronze | Notebook, Audit | Traçabilité réglementaire |
Silver | SQL Endpoint, BI | Analytics opérationnels |
Gold | Power BI DirectLake | Dashboards temps réel |
Connexions disponibles
- SQL Analytics Endpoint :
ws-prod.sql.azuresynapse.net
- Power BI : Mode DirectLake (pas de copie)
- DBeaver : JDBC Azure AD
- API REST : Automatisation des rapports
Monitoring & Qualité
Métriques clés
- Volume : lignes par médallion
- Qualité : % de nulls, doublons détectés
- Performance : temps de traitement par étape
Alertes configurées
- Ăchec pipeline â Teams
- Anomalie qualitĂ© â Email
- Latence > SLA â SMS
Conclusion
Cette architecture Fabric Lakehouse offre :
- Scalabilité : passage de Mo à Pb sans refactoring
- Fiabilité : garantie ACID via Delta
- Agilité : exploration SQL sans copie de données
- Gouvernance : traçabilitĂ© complĂšte Bronze â Gold
Pour aller plus loin : ajout du streaming pour les données temps réel et CI/CD Git pour les notebooks.