> ## Content Index
> Fetch the complete content index at: https://www.idriss-benbassou.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Glue ETL avec Glue Studio : le premier job de nettoyage raw vers clean
- URL: https://www.idriss-benbassou.com/glue-etl-studio-job-nettoyage-raw-clean/
- Published: 2026-08-20T14:50:00.000Z
- Updated: 2026-08-20T14:50:00.000Z
- Author: Idriss BENBASSOU
- Tags: AWS, #rating-3

Jusqu'ici, [la zone clean](https://www.idriss-benbassou.com/data-lake-s3-zones-raw-clean-curated-versioning-lifecycle/) s'est construite simplement avec des CTAS lancés à la main, et les 15 doublons repérés avec Athena sont toujours dedans. En réalité en mission on fait jamais cela car un nettoyage doit être un job, quelque chose qu'on rejoue, qu'on planifie et qu'on monitore. Sur AWS, c'est le rôle de Glue ETL, des jobs Spark sans cluster à gérer.

Glue propose deux façons d'écrire un job, en visuel avec Glue Studio, ou en code PySpark. On commence par le visuel, et le prochain article de [la formation](https://www.idriss-benbassou.com/formation-aws/) on va ouvrir plus le capot pour voir le code généré derrière.

L'objectif du job est de lire `raw commandes` depuis le catalogue, supprimer les doublons, typer la date, écrire en Parquet dans la zone clean et mettre à jour le catalogue.

## On supprime l'existant

La table `ecommerce_clean.commandes` créée au CTAS de l'article Parquet va être remplacée par la version propre du job. On la supprime, ainsi que ses fichiers.

```sql
DROP TABLE ecommerce_clean.commandes;

```

```powershell
aws s3 rm s3://ibdata-datalake-formation/clean/commandes/ --recursive

```

Le DROP ne supprime que la définition dans le catalogue, jamais les fichiers S3, d'où la deuxième commande. C'est le comportement de toutes les tables externes, la donnée et sa description vivent séparément.

## Construire le job dans Glue Studio

Dans la console, ouvre **AWS Glue**, menu **"ETL jobs"**, puis **"Visual ETL"**. Un canvas vide s'affiche, on va y poser 4 blocs.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-46.png)

**1\. La source.** Ajoute un nœud **"AWS Glue Data Catalog"**, et sélectionne la database `ecommerce_raw`, table `commandes`.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-47.png)

**2\. La déduplication.** Ajoute une transformation **"Drop Duplicates"** branchée sur la source, en mode "Match entire rows". Nos 15 doublons sont des copies parfaites de lignes existantes, ce mode les élimine.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-48.png)

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-49.png)

**3\. Le schéma.** Ajoute une transformation **"Change Schema"**. Deux réglages, passe `date_commande` du type string au type **date**, et coche "Drop" sur la colonne `partition_0`, elle décrit l'arborescence raw et n'a rien à faire dans la table clean.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-50.png)

**4\. La cible.** Ajoute un nœud **"Amazon S3"** en sortie. Format **Parquet**, compression **Snappy**, emplacement `s3://ibdata-datalake-formation/clean/commandes/`. 

Et dans les options du catalogue, choisis **"Create a table in the Data Catalog and on subsequent runs, update the schema"**, database `ecommerce_clean`, table `commandes`. Le job écrira les fichiers ET déclarera la table, pas besoin de crawler derrière.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-51.png)

Le canvas complet ressemble à ça, source, déduplication, schéma, cible.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-52.png)

## Configurer et lancer

Onglet **"Job details"** avant de lancer.

- **Name** : `job-clean-commandes`.
- **IAM Role** : le rôle `AWSGlueServiceRole-formation` créé pour le crawler. Si le run échoue en erreur de permissions S3, ajoute-lui l'accès en écriture sur le bucket, on détaillera tout ça dans le module IAM.
- **Worker type** : G 1X, **2 workers**, le minimum, largement suffisant pour nos volumes.
- **Job bookmark** : Disable pour l'instant (on en reparlera pour l'incrémental).

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-53.png)

Clique sur **"Save"** puis **"Run"**. Direction l'onglet "Runs" pour suivre l'exécution.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-54.png)

💡

Le job met quelques minutes à démarrer avant de traiter quoi que ce soit, c'est le temps de provisionner le cluster Spark derrière et c'est normal car Glue est fait pour les traitements de masse, pas pour réagir à la seconde (ça, c'est le rôle de Lambda, qu'on va voir dans un prochain article).

## Planifier le job

Dans la section Schedules, on peut planifier l'exécution du job à fréquence régulière. On ne va pas le faire parce qu'on planifiera tout le pipeline proprement dans le module orchestration.

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-55.png)

## Vérifier dans Athena

Trois requêtes sur la nouvelle table.

```sql
-- 1015 lignes en raw, 1000 lignes en clean ?
SELECT COUNT(*) FROM ecommerce_clean.commandes;

-- Les doublons ont-ils disparu ?
SELECT commande_id, COUNT(*) FROM ecommerce_clean.commandes
GROUP BY commande_id HAVING COUNT(*) > 1;
-- zéro ligne

-- La date est-elle typée ?
SELECT month(date_commande), COUNT(*) FROM ecommerce_clean.commandes
GROUP BY 1 ORDER BY 1;
-- passe sans CAST

```

![](https://storage.ghost.io/c/60/f1/60f18be4-df79-4956-8e4a-c2fa80212e93/content/images/2026/08/image-56.png)

1 000 lignes, zéro doublon, une vraie date. La zone clean mérite enfin son nom, et le nettoyage est devenu un job rejouable au lieu d'une suite de requêtes manuelles.

💡

Les 5 montants NULL sont toujours là et c'est un choix. Supprimer une commande parce que son montant manque, c'est perdre de l'information. En vrai projet, ces lignes partent dans une table de rejets pour être corrigées à la source, on mettra cela en place dans un prochain article.

## Ce que ça coûte

Glue facture les DPU à la seconde, 0,44 $ par DPU-heure avec un minimum d'une minute. Notre job, 2 workers G 1X pendant 2 à 3 minutes, revient à **2 ou 3 centimes par run**. C'est le service le plus cher de la série jusqu'ici, et c'est vite oublié face à ce qu'il remplace, un cluster Spark à monter et maintenir.

## La checklist finale

- \[ \] L'ancienne table CTAS supprimée, catalogue et fichiers S3.
- \[ \] Le job 4 nœuds construit, source, Drop Duplicates, Change Schema, cible S3.
- \[ \] Run en Succeeded.
- \[ \] Vérification Athena, 1 000 lignes, zéro doublon, date typée.

### 

## La suite ?

Le visuel c'est bien pour démarrer, mais en mission le job vit dans Git, se relit en code review et se débugge ligne à ligne. Prochain article, on ouvre l'onglet Script du job pour décortiquer le **PySpark généré**, comprendre les DynamicFrames, et modifier le code directement.

## Aller plus loin

Le programme complet du parcours est sur la page de [la formation AWS](https://www.idriss-benbassou.com/formation-aws/).

Tu prépares la certification AWS Certified Data Engineer Associate (DEA-C01) ? Glue ETL, les workers et les DPU sont au programme de l'examen. Pour t'entraîner, j'ai créé des questions d'examen blanc en français.

👉 [S'entraîner sur DataCertification.fr](https://datacertification.fr/certifications?ref=idriss-benbassou.com)

Tu veux que je t'accompagne sur ton projet data (AWS, Snowflake, dbt, modélisation, coûts) ?

👉 [Réserver un appel de 30 minutes](https://calendly.com/idriss-benbassou-datavio/30min?ref=idriss-benbassou.com)

## Questions fréquentes

#### C'est quoi AWS Glue ETL ?

Le service de jobs Spark serverless d'AWS. On définit un traitement (en visuel avec Glue Studio ou en PySpark), Glue provisionne le cluster, exécute, et facture à la seconde de calcul. Aucun serveur à gérer.

#### C'est quoi Glue Studio ?

L'éditeur visuel des jobs Glue. On assemble des nœuds (sources, transformations, cibles) sur un canvas, et Glue génère le script PySpark correspondant. Pratique pour démarrer et pour les jobs simples, le code reste accessible pour aller plus loin.

#### Pourquoi mon job Glue met quelques minutes avant de traiter les données ?

C'est le démarrage du cluster Spark sous-jacent. Ce temps de provisionnement est incompressible et fait de Glue un outil de traitement par lots, pas de temps réel. Pour réagir à un événement en secondes, c'est Lambda.

#### Combien coûte un job Glue ?

0,44 $ par DPU-heure, facturé à la seconde avec un minimum d'une minute. Un petit job à 2 workers G.1X qui tourne 3 minutes coûte 2 à 3 centimes. Le levier de coût principal, dimensionner les workers au volume réel.

#### DROP TABLE supprime-t-il les fichiers dans S3 ?

Non. Les tables du catalogue sont externes, le DROP retire la définition du Data Catalog mais laisse les fichiers S3 intacts. Pour tout supprimer, il faut le DROP puis un aws s3 rm sur l'emplacement.