🟡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.

À propos de moi
Je m’appelle Willy Marchais, ingĂ©nieur et entrepreneur spĂ©cialisĂ© dans la Data et l’intelligence artificielle. J’accompagne les personnes qui veulent aligner leur vision sur leur activitĂ© et apporter leur contribution unique. IngĂ©nieur en systĂšmes d’information de formation, j’ai grandi en France en Bretagne dans une petite ville prĂšs de

📍 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.

Read more