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

# Amazon Athena : requêter son data lake S3 en SQL
- URL: https://www.idriss-benbassou.com/amazon-athena-requeter-data-lake-s3-sql/
- Published: 2026-08-18T21:55:26.000Z
- Updated: 2026-08-19T06:52:47.000Z
- Author: Idriss BENBASSOU
- Tags: AWS, #rating-2

On a précédemment [structurer le lake](https://www.idriss-benbassou.com/data-lake-s3-zones-raw-clean-curated-versioning-lifecycle/) et [alimenter le data catalogue](https://www.idriss-benbassou.com/glue-data-catalog-crawler-data-lake-s3/). Il est maintenant temps de requêter. Avec Athena, le principe est assez simple. On écrit du SQL directement sur les fichiers stockés dans S3 et sans données à charger ailleurs. Athena lit les fichiers, renvoie le résultat et facture selon le volume de données scannées.

Dans cet article, on va lancer les premiers SELECT sur nos tables, on règle le problème des dates en string annoncé dans [l'article précédent](https://www.idriss-benbassou.com/glue-data-catalog-crawler-data-lake-s3/), et on attaque après le cleaning du dataset.

## Le réglage bloquant, le bucket de résultats

Athena écrit le résultat de chaque requête dans S3, et tant qu'on ne lui a pas dit où, on ne peut exécuter de requête. 

On lui donne un préfixe dédié dans notre bucket, hors des zones du lake.

1. Ouvre le service **Athena** et l'éditeur de requêtes.
2. Clique sur l'onglet **"Query Settings"** ou sur le bouton **"Edit Settings"**

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

1. Clique sur **"Manage"**.

\=> Renseigne `s3://ibdata-datalake-formation/athena-results/` et sauvegarde.

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

💡

Les résultats de requêtes s'accumulent, donc chaque exécution écrit un fichier. Le bon réflexe, une lifecycle rule sur le préfixe athena-results/ qui supprime tout après 7 jours. Même manip que dans [l'article data lake](https://www.idriss-benbassou.com/data-lake-s3-zones-raw-clean-curated-versioning-lifecycle/), 2 minutes, et le ménage se fait tout seul à vie.

## Premier SELECT

Dans l'éditeur, vérifie en haut à gauche que la database est `ecommerce_raw`, les 4 tables du crawler apparaissent. On commence simple.

```sql
SELECT * FROM commandes LIMIT 10;

```

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

Prends le temps de regarder deux informations sous le résultat, le **temps d'exécution** et surtout la **donnée scannée** (Data scanned) car c'est le chiffre le plus important de l'écran, c'est lui qu'on paye, 5 $ par To scanné. Ici environ 47KB, autant dire rien, mais le réflexe de le lire à chaque requête est important sur de vrais volumes.

💡

Sur Athena, on ne paye ni le temps, ni le nombre de requêtes, on paye la donnée scannée. Toute l'optimisation Athena consiste à scanner moins.

Petit test au passage, lance la même requête en ne sélectionnant qu'une colonne.

```sql
SELECT commande_id FROM commandes LIMIT 10;

```

La donnée scannée n'a pas vraiment bougé. Normal, car un CSV se lit ligne entière et donc demander une colonne ou toutes revient au même. Retiens ce comportement, c'est exactement ce que Parquet corrigera dans le prochain article.

## Régler le problème des dates

Le crawler a typé `date_commande` en string. Tant qu'on compare des chaînes ISO, ça passe par chance (l'ordre alphabétique suit l'ordre chronologique), mais dès qu'on veut faire un vrai calcul de dates, ça casse.

```sql
-- Erreur : month() ne fonctionne pas sur une string
SELECT month(date_commande) FROM commandes LIMIT 5;

```

La solution, caster à la lecture.

```sql
-- Le chiffre d'affaires par mois
SELECT
    date_trunc('month', CAST(date_commande AS date)) AS mois,
    ROUND(SUM(montant), 2) AS ca
FROM commandes
WHERE statut != 'annulee'
GROUP BY 1
ORDER BY 1;

```

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

Le CAST fonctionne parce que nos dates sont au format ISO (2026-08-16). Cela reste acceptable en zone raw, mais la vraie correction arrive au passage en Parquet, où les types seront embarqués dans le fichier une fois pour toutes.

💡

Si les valeurs que tu trouves sont le double ou le triple de la capture d'écran ci-dessus, regarde la colonne partition\_0\. Une valeur en trop (autre chose que le dossier daté) veut dire que le crawler a trouvé un sous-dossier doublon avec une copie des données dedans, supprime-le

## Cleaning des données

Le dataset embarque des défauts volontaires.

Les doublons d'abord.

```sql
SELECT commande_id, COUNT(*) AS nb
FROM commandes
GROUP BY commande_id
HAVING COUNT(*) > 1
ORDER BY commande_id;

```

C'est le type d'erreur qu'on peut avoir si un export qui a tourné deux fois, un incident d'intégration, les causes varient mais le symptôme est toujours le même. On les éliminera proprement au chargement de la zone clean avec Glue.

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

Les montants vides ensuite.

```sql
SELECT COUNT(*) AS montants_manquants
FROM commandes
WHERE montant IS NULL;

```

5 lignes. Nos montants vides dans le CSV sont devenus des NULL à la lecture, comme annoncé dans l'article crawler. Toute somme les ignore silencieusement, ce qui fausse un chiffre d'affaires sans jamais lever d'erreur. C'est pour ça qu'un audit de NULL sur les colonnes de mesure est le premier réflexe sur une source inconnue.

💡

Athena tourne sur le moteur Trino (ex Presto) donc toutes les fonctions SQL disponibles, date\_parse, regexp, fonctions fenêtres, sont celles de Trino, la doc à garder sous la main est celle-là et pas celle de MySQL ou PostgreSQL.

## Ce que ça coûte

5 $ par To scanné, avec un minimum de 10 Mo facturés par requête. Nos requêtes du jour scannent quelques dizaines de Ko chacune, donc facturées 10 Mo, soit 0,00005 $ la requête. Toute la session tient dans un dixième de centime. La facture Athena ne devient un sujet qu'avec les volumes, et c'est justement l'objet du prochain article.

## La checklist finale

- \[ \] Query result location configurée sur **athena-results/**, avec sa lifecycle rule de purge à 7 jours.
- \[ \] Premier SELECT passé, le réflexe **donnée scannée** est pris.
- \[ \] Le CA par mois calculé avec le **CAST** des dates.
- \[ \] Les défauts trouvés, **15 doublons** et **5 montants NULL**.

### Combien ça coûte ?

Moins d'**un centime** pour toute la session, au minimum de facturation de 10 Mo par requête.

## La suite ?

On sait requêter, on sait ce qu'on paye. Dans le prochain article, on convertit le dataset en **Parquet** et on compare, même requête, même donnée, deux formats, et la donnée scannée qui s'effondre à l'écran. C'est l'article qui fait baisser les factures.

## 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) ? Athena, sa tarification au scan et ses réglages sont un incontournable 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 Amazon Athena ?

Un service de requêtage SQL serverless qui lit directement les fichiers S3 décrits dans Glue Data Catalog. Aucun serveur à gérer, aucune donnée à charger, la facturation se fait à la donnée scannée.

#### Pourquoi Athena demande un bucket de résultats ?

Athena écrit le résultat de chaque requête dans S3 avant de l'afficher. Sans emplacement configuré, aucune requête ne peut s'exécuter. C'est le premier réglage à faire, et il mérite une lifecycle rule de purge pour éviter l'accumulation.

#### Combien coûte une requête Athena ?

5 $ par To de donnée scannée, avec un minimum de 10 Mo facturés par requête. Le levier de coût, c'est de réduire le scan, avec les formats colonnes comme Parquet et le partitionnement.

#### Comment gérer des dates stockées en string dans Athena ?

En castant à la lecture, CAST(colonne AS date) pour un format ISO, ou date\_parse pour les autres formats. La correction durable consiste à convertir la donnée en Parquet, qui embarque les vrais types.

#### Quel moteur SQL utilise Athena ?

Trino (anciennement Presto). Les fonctions disponibles, les fonctions de dates, les regex et les fonctions fenêtres sont celles de Trino, dont la documentation sert de référence.

#### Pourquoi sélectionner une seule colonne ne réduit pas la donnée scannée ?

Parce qu'un CSV se lit ligne entière, quel que soit le nombre de colonnes demandées. Seuls les formats colonnes comme Parquet permettent de ne lire que les colonnes utilisées, et donc de payer moins.