đĄ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.
                            