Rapport Lab 2: Data Warehouse ETL

📋 RĂ©sumĂ© ExĂ©cutif

✅ Construction rĂ©ussie d’un entrepĂŽt de donnĂ©es avec architecture Star Schema.

Statistiques:

  • 6 tables de dimension
  • 1 table de faits
  • 20 Ă©vĂ©nements
  • 3 formats d’export
  • 100% portes de qualitĂ© validĂ©es

📊 Architecture Finale

SchĂ©ma en Étoile

                    dim_utilisateur
                           ↑
                           │
    dim_date ← fact_events → dim_produit
    dim_age ↗         ↘ dim_categorie
                    dim_marque

Dimensions

dim_utilisateur (10 rows)

  • user_key (PK)
  • user_id (FK mĂ©tier)
  • gender
  • birthdate
  • generation (Traditionalists/Boomers/GenX/Millennials/GenZ)

dim_age (10 rows)

  • age_key (PK)
  • age_band (<18, 18-24, 25-34, 
, 85-94, unknown)
  • min_age, max_age

dim_marque (5 rows)

  • brand_key (PK)
  • brand_code
  • brand_desc

dim_categorie (5 rows)

  • category_key (PK)
  • category_code
  • category_desc

dim_produit (10 rows)

  • product_key (PK)
  • product_id
  • product_desc
  • brand_key (FK)
  • category_key (FK)

dim_date (4 rows)

  • date_key (PK) [YYYYMMDD]
  • date
  • year, month, day
  • day_of_week, day_name
  • is_weekend
  • week_of_year, month_name
  • quarter

Table de Faits

fact_events (20 rows)

ColonneTypeFK
date_keyINT✅
utilisateur_keyINT✅
age_keyINT✅
produit_keyINT✅
marque_keyINT✅
categorie_keyINT✅
session_idSTRING-
event_timeTIMESTAMP-
event_typeSTRING-
priceDOUBLE-

✅ Portes de QualitĂ©

Porte 1: Comptage Non-ZĂ©ro ✅

Condition: COUNT(fact_events) > 0
Résultat: 20 > 0
Statut: ✅ PASS

Porte 2: Taux de NullitĂ© ✅

date_key:     0.00% ≀ 5.00%  ✅
utilisateur_key: 0.00% ≀ 5.00%  ✅
produit_key:  0.00% ≀ 5.00%  ✅
event_type:   0.00% ≀ 1.00%  ✅
price:        0.00% ≀ 20.00% ✅

Porte 3: IntĂ©gritĂ© RĂ©fĂ©rentielle ✅

FK date_key → dim_date:         0 manquants ✅
FK utilisateur_key → dim_utilisateur: 0 manquants ✅
FK produit_key → dim_produit:   0 manquants ✅

📈 Compression & Performance

Comparaison Tailles de Fichiers

FormatTailleRatio vs Parquet
CSV brut0.0010 MB2.0x
CSV Snappy0.0008 MB1.6x
Parquet0.0005 MB1.0x

Conclusion: Parquet est 2x plus compact que CSV!

đŸ› ïž Transformations AppliquĂ©es

Nettoyage events

✅ Suppression timestamps NULL
✅ Suppression session_id NULL
✅ Suppression product_id NULL
✅ Filtre prix nĂ©gatifs
✅ Filtre dates futures
✅ Validation event_types
✅ Suppression prix outliers (>100x moyenne)

Enrichissement Dimensions

dim_utilisateur:
  + Calcul year_of_birth
  + Classification génération (basée année naissance)
  + Génération user_key (dense_rank)
 
dim_produit:
  + JOIN product_name (descriptions)
  + JOIN dim_marque (brand_key)
  + JOIN dim_categorie (categorie_key)
  + Génération product_key

Construction fact_events

events_clean
  → JOIN session_bridge (session_id → utilisateur_id)
  → JOIN prod_lkp (produit_id → clĂ©s)
  → JOIN date_lkp (event_date → date_key)
  → JOIN utilisateur_lkp (utilisateur_id → utilisateur_key)
  → CALCUL age_on_event (F.months_between)
  → JOIN dim_age (age_on_event → age_key)

📊 Statistiques DonnĂ©es

Comptages CSV Sources

user.csv:        10 lignes
session.csv:     10 lignes
product.csv:     10 lignes
product_name.csv: 5 lignes
events.csv:      20 lignes
brand.csv:        5 lignes
category.csv:     5 lignes

AprĂšs Nettoyage

events_clean: 20 lignes
  - 0 suppressions timestamp NULL
  - 0 suppressions session_id NULL
  - 0 suppressions product_id NULL
  - 0 suppressions prix négatifs
  - 0 suppressions dates futures

AprĂšs Star Schema

fact_events: 20 lignes (100% conservés)
  - Toutes dimensions liées
  - Aucune porte de qualité échouée

⚙ Configuration Spark

Spark Version: 4.0.1
Master: local[*]
Driver Memory: 8g
Shuffle Partitions: 200
Adaptive Query Execution: Enabled
Compression: snappy

🎓 Concepts MaĂźtrisĂ©s

✅ Star Schema design ✅ Dimension vs Fact tables ✅ Surrogate keys (dense_rank) ✅ Data quality gates ✅ Parquet vs CSV ✅ Window functions (OVER, PARTITION BY) ✅ Multi-table joins (LEFT joins) ✅ Date handling ✅ Price outlier detection ✅ Generation classification

📝 Cellules Notebook

#TitreLignes
0Imports & Setup12
1Spark Init17
2Load CSV25
3dim_utilisateur18
4dim_age18
5dim_marque11
6dim_categorie11
7dim_produit32
8dim_date26
9Résumé dimensions18
10Clean events23
11Analyse prix28
12Lookup tables16
13fact_events52
14Affichage fact_events13
15Portes qualité56
16Exports29
17Comparaison sizes35
18Spark plans12
19Résumé final40

Total: 507 lignes de code PySpark

🏆 RĂ©sultats Finaux

  • ✅ Star schema complet et validĂ©
  • ✅ 6 dimensions de haute qualitĂ©
  • ✅ 1 table de faits avec 20 Ă©vĂ©nements
  • ✅ 3 formats d’export (CSV, Snappy, Parquet)
  • ✅ 100% portes de qualitĂ© validĂ©es
  • ✅ Compression optimale (Parquet 2x plus petit)
  • ✅ Aucun data quality issue
  • ✅ IntĂ©gritĂ© rĂ©fĂ©rentielle 100%

📚 RĂ©fĂ©rences


Rapport généré le: Décembre 8, 2025 Auteur: Badr TAJINI Institution: ESIEE Paris