// SI Décisionnels · ESPRIT · 1 BA 2 //

Entrepôt de Données RH

ETL Pipeline · Star Schema · Talend · Postgresql · 2025–2026

👨‍💻 Etudiants: Hamza Bouguerra & Feres Messedi · 1BA2 Voir sur GitHub
Hamza Bouguerra
×
Fares Messedi
🔄 Pipeline ETL
⭐ Schéma Étoile
⚠️ Anomalies
⚙️ Flux Talend
📊 Résultats
🛠️ Générateur
🎬 Animations

📋 Contexte du Projet

Une entreprise souhaite centraliser les informations de ses employés afin d'améliorer la gestion des ressources humaines. Les données proviennent de trois sources hétérogènes (CSV, SQL et Excel) et doivent être intégrées dans un entrepôt de données unique selon une modélisation décisionnelle en schéma étoile.

Le projet couvre l'intégralité du cycle ETL : extraction multi-sources, nettoyage (doublons, valeurs nulles), jointures par identifiant employé, création de colonnes calculées (salaire annuel, total absences, nb formations), et chargement dans un DW structuré avec tables de faits et dimensions.

📥 Extraction multi-sources 🧹 Nettoyage données 🔗 Jointures matricule 🧮 Colonnes calculées ⭐ Schéma en étoile 📤 Chargement DW ⚙️ Talend ETL 🗄️ Postgresql 📅 Deadline : 14 Mars 2026
Architecture du Pipeline
📥 Extraction
📄 absences_presences.csv NULLDUP
id_absence · matricule · date_absence
motif · duree_jours · justifie · remarque
───────────────────────
582 lignes · 62 doublons (10.7%)
Nulls : motif 9.3% · durée 8.6% · justifié 9.1%
86 employés concernés · 6 motifs distincts
🗄️ employes_salaires.sql NULLDUP
matricule · nom · prénom · service
salaire_mensuel · ville · email
───────────────────────
112 inserts employes → 100 uniques
12 doublons (nom en MAJUSCULES)
Nulls salaire: 14 · email: 9 · ville: 7
1 200 lignes salaires (100 emp × 12 mois)
📊 formations.xlsx NULLDUP
id_formation · matricule · intitulé
durée (h) · année · coût (DT) · statut
───────────────────────
266 lignes · 28 doublons (10.5%)
Nulls : coût 11.7% · statut 11.3% · durée 9%
16 intitulés · années 2022–2024
⚙️ Transformation
🧹
Nettoyage
tUniqRow → suppression doublons
tReplaceList → correction NULLs
Valeurs par défaut : "N/A", 0
🔗
Jointures
tMap : employes ↔ absences
tMap : employes ↔ formations
Clé de jointure : matricule
🧮
Colonnes calculées
Salaire annuel = mensuel × 12
Total jours d'absence / employé
Nombre formations / employé
🔑
Clés surrogate
Génération SK pour chaque dim
sk_employe · sk_temps
sk_formation · sk_absence
📤 Chargement DW
⭐ FAIT_RH FACT TABLE
PK id_fait · FK sk_employe
FK sk_temps · FK sk_absence
FK sk_formation
salaire_mensuel · salaire_annuel
nb_jours_absence · nb_formations · prime
→ 1 032 lignes chargées
👤 DIM_EMPLOYE DIM
PK sk_employe · matricule · nom
prénom · service · ville · email
→ 100 lignes
📅 DIM_TEMPS DIM
PK sk_temps · date_complete
jour · mois · trimestre · année
nom_mois · nom_jour · est_weekend
→ 1 096 lignes (2022–2024)
📋 DIM_ABSENCE DIM
PK sk_absence · id_absence · matricule
date_absence · motif · duree_jours · justifié
→ 520 lignes
🎓 DIM_FORMATION DIM
PK sk_formation · id_formation · matricule
intitulé · durée · année · coût · statut
→ 238 lignes
⭐ FAIT_RH
PK id_fait
FK sk_employe
FK sk_temps
FK sk_absence
FK sk_formation
📊 salaire_mensuel
📊 salaire_annuel
📊 nb_jours_absence
📊 nb_formations
📊 prime
→ 1 032 lignes
👤 DIM_EMPLOYE
PK sk_employe
matricule
nom · prénom
service
ville · email
salaire_mensuel
→ 100 lignes
📅 DIM_TEMPS
PK sk_temps
date_complete
jour · mois · année
trimestre · semaine
nom_mois · nom_jour
est_weekend
→ 1 096 lignes
📋 DIM_ABSENCE
PK sk_absence
id_absence · matricule
date_absence
motif
duree_jours
justifié
→ 520 lignes
🎓 DIM_FORMATION
PK sk_formation
id_formation · matricule
intitulé
duree_heures · année
coût · statut
→ 238 lignes
Table de Faits
Table de Dimension
Clé Primaire (PK)
Clé Étrangère (FK)

🗄️ employes_salaires.sql

Doublons (casse nom)12%
NULL salaire_mensuel14%
NULL email9%
NULL ville7%
Total INSERT employes112
Doublons éliminés (casse)12
Employés uniques chargés100
Lignes salaires1 200
NULL salaire (salaires)114
Traitement TalendtUniqRow + tMap

📄 absences_presences.csv

Doublons exacts10.7%
NULL / vide motif9.3%
NULL justifié9.1%
NULL duree_jours8.6%
Total lignes brutes582
Doublons éliminés62
Lignes chargées (dim_absence)520
NULL motif → "Non précisé"54
Colonne remarque (ignorée)582 vides
Traitement TalendtUniqRow + tReplaceList

📊 formations.xlsx

Doublons exacts10.5%
NULL Coût (DT)11.7%
NULL Statut11.3%
NULL Durée (h)9.0%
Total lignes brutes266
Doublons éliminés28
Lignes chargées (dim_formation)238
NULL coût → 0.031
NULL statut → "Inconnu"30
Traitement TalendtUniqRow + tMap
J0

Job_InitialLoad — Chargement des tables staging

Sources → rh_entreprise : DDL + chargement des 4 tables de staging

✔ Code 0
4 flux parallèles — résultats réels
📄
absences_presences
582 rows in 0.04s
📊
formations
266 rows in 0.67s
🗄️
employes
106 rows in 0.03s
💰
salaires
1200 rows in 0.06s
Flux principal — résultats réels
🗺️
tMap × 4
Mapping colonnes vers staging
📤
tDBOutput × 4
stg_absences · stg_formations stg_employes · stg_salaires
→ 2 154 lignes chargées au total
⚙️ Ce job crée les tables de staging dans rh_entreprise et y charge les données sources brutes (CSV, Excel, SQL). C'est le point d'entrée obligatoire avant tous les autres jobs.
Capture Talend J0
J1

Job_Load_DIM_EMPLOYE

stg_salaires (1200) + stg_employes (106) → DIM_EMPLOYE (100 lignes)

✔ Code 0
Flux principal — résultats réels
💰
stg_salaires
1200 rows · 0.3s
🔁
tUniqRow_1
Dédup salaires → 1200 uniques
🗺️
tMap_1
Lookup stg_employes 100 rows → 1200 out
👤
dim_employe
1200 rows · 0.41s
🗄️
stg_employes
106 rows · 0.24s
🔁
tUniqRow_2
12 doublons éliminés → 100 uniques
→ dim_employe (100 employés uniques)
🔑 tUniqRow_2 filtre les 12 doublons (nom en MAJUSCULES). Le tMap_1 effectue un lookup stg_employes → 100 lignes pour enrichir les salaires.
Capture Talend J1
J2

Job_Load_DIM_TEMPS

Génération programmatique → DIM_TEMPS (1 096 lignes)

✔ Code 0
Flux principal — résultats réels
📅
tRowGenerator_1
1096 dates 2022→2024 · 0.08s
🗺️
tMap_1
Calcul jour, mois, trimestre · 1096 rows · 0.35s
📤
tDBOutput_1
dim_temps 1096 rows
→ dim_temps (1 096 lignes)
📅 Job indépendant — tRowGenerator génère 1 ligne par jour sur 3 ans (365 + 365 + 366 = 1 096). Le tMap calcule tous les attributs temporels.
Capture Talend J2
J3

Job_Load_DIM_ABSENCE

stg_absences_presences (582) → DIM_ABSENCE (520 lignes)

✔ Code 0
Flux principal — résultats réels
📄
stg_absences
582 rows · 0.14s
🔁
tUniqRow_1
62 doublons éliminés → 520
🔄
tReplace_1
NULL motif → "Non précisé"
🗺️
tMap_1
duree_jours → 0 · 520 rows · 0.43s
📤
tDBOutput_1
dim_absence · 520 rows
→ dim_absence (520 lignes)
🔗 Dépend de J0. tUniqRow clé : id_absence + matricule + date_absence. Le tReplace corrige les champs texte vides avant le tMap.
Capture Talend J3
J4

Job_Load_DIM_FORMATION

stg_formations (266) → DIM_FORMATION (238 lignes)

✔ Code 0
Flux principal — résultats réels
📊
stg_formations
266 rows · 0.07s
🔁
tUniqRow_2
28 doublons éliminés → 238
🗺️
tMap_1
NULL coût → 0.0, statut → "Inconnu" · 238 rows · 0.34s
📤
tDBOutput_1
dim_formations · 238 rows
→ dim_formations (238 lignes)
📊 Dépend de J0. tUniqRow déduplication par id_formation. tMap gère 3 types de NULL avec valeurs par défaut distinctes.
Capture Talend J4
J5

Job_Load_FAIT_RH — Table de Faits (exécuter en dernier)

dim_employe + lookups absences/formations/temps → FAIT_RH (1 032 lignes)

✔ Code 0
Flux principal — résultats réels
👤
dim_employe
1200 rows · 0.07s (Main)
🗺️
tMap_1
Lookups dim_absence(520) dim_formations(238) dim_temps(1096) → 1032 rows · 0.16s
tDBOutput_1
fait_rh · 1032 rows · 6450 rows/s
📋 dim_absence
Lookup · 520 rows · 0.26s
🎓 dim_formations
Lookup · 238 rows · 0.04s
📅 dim_temps
Lookup · 1096 rows · 0.05s
→ fait_rh (1 032 lignes chargées)
⚠️ DOIT être exécuté après J1, J2, J3 et J4. Le tMap central résout les clés étrangères via lookups sur les 3 dimensions.
Capture Talend J5
J6

Job_Load_ALL — Orchestrateur complet

Chaîne les 6 jobs J0 → J5 en séquence avec OnSubjobOk

✔ Code 0
tRunJob_1
J0_InitialLoad
ok→
tRunJob_2
J1_DIM_EMPLOYE
ok→
tRunJob_3
J2_DIM_TEMPS
ok→
tRunJob_4
J3_DIM_ABSENCE
ok→
tRunJob_5
J4_DIM_FORMATION
ok→
tRunJob_6
J5_FAIT_RH
Connexion : OnSubjobOk Exécution séquentielle ✔ Pipeline complet en ~1s
🚀 Orchestre tout le pipeline en un seul clic. La connexion OnSubjobOk garantit qu'un job ne s'exécute que si le précédent a réussi (Code de sortie = 0).
Capture Talend J6
Résultats d'exécution réels — Talend Open Studio
Récapitulatif global du pipeline
JOB ENTRÉE DOUBLONS NULLS CORRIGÉS CHARGÉS CIBLE STATUT
J0 · InitialLoad2 1542 1544 tables staging✔ 0
J1 · DIM_EMPLOYE106 + 12001230100dim_employe✔ 0
J2 · DIM_TEMPSgénérée1 096dim_temps✔ 0
J3 · DIM_ABSENCE58262157520dim_absence✔ 0
J4 · DIM_FORMATION2662885238dim_formations✔ 0
J5 · FAIT_RH100 emp1 032fait_rh✔ 0
J6 · Load_ALLorchestrateurtout le DWJ0→J5✔ 0
Base rh_entreprise (sources + staging)
📁 Tables (7)
🗂 employes 112 → 100
🗂 rh_entreprise
🗂 salaires 1 200
🗂 stg_absences_presences 582
🗂 stg_employes 106
🗂 stg_formations 266
🗂 stg_salaires 1 200
pgAdmin rh_entreprise
Base rh_dw (Data Warehouse)
📁 Tables (5)
🔷 dim_absence 520 lignes
🔷 dim_employe 100 lignes
🔷 dim_formations 238 lignes
🔷 dim_temps 1 096 lignes
⭐ fait_rh 1 032 lignes
PostgreSQL 18 · localhost:5432
pgAdmin rh_dw
100
EMPLOYÉS UNIQUES
1 096
DATES (3 ANS)
520
ABSENCES NETTOYÉES
238
FORMATIONS NETTOYÉES
1 032
FAITS CHARGÉS
7 / 7
JOBS RÉUSSIS (Code = 0)

🛠️ Paramètres de Génération

Nombre d'employés 100
Taux de doublons 12%
Taux de valeurs NULL 10%
Absences max / employé 12
Formations max / employé 4
Fichiers à générer
📄 CSV
🗄️ SQL
📊 Excel
Langue des données
🇹🇳 Tunisien
🇬🇧 English

📦 Résultat de Génération

⚙️
Configure les paramètres et clique sur Générer
🎬 Démo complète des jobs Talend
Exécution complète du pipeline Talend (J0 → J6) en temps réel
Durée totale ≈ 03 min et 09 secondes · Résolution 1080p