Cataloguer les fichiers de ventes avec Glue

AWSBeginner
Pratiquer maintenant

Introduction

Une petite boutique exporte ses ventes en CSV. Un analyste veut interroger ces fichiers sans les copier dans un serveur de base de données. Placez le fichier dans Amazon S3 et décrivez-le dans AWS Glue Data Catalog, un répertoire de métadonnées indiquant aux services de requête où sont les données et comment les lire.

Terminez AWS Foundations for Beginners, les opérations S3 de base et les notions d’identité IAM. Cet environnement indépendant fournit des buckets vides, des CSV et une identité AWS CLI configurée ; aucun compte personnel ni ressource d’un autre lab n’est requis. Utilisez Terminal et observez les objets et le catalogue réels dans AWS View. Le catalogue décrit les fichiers sans copier, transformer ni interroger leur contenu. Athena arrive au prochain lab.

Lien avec la certification

Certification Tâche d’examen Pratique
Cloud Practitioner (CLF-C02) Task 3.7 Distinguer le rôle de catalogue de Glue pour l’analyse des fichiers du stockage dans S3.

Schéma conceptuel : charger le CSV dans S3 et décrire son schéma et son emplacement dans Glue.

Charger le fichier de ventes

Dans cette étape, examinez les données fournies et chargez-les dans S3. Un CSV représente un enregistrement par ligne, avec des champs séparés par des virgules. La première ligne nomme les champs. Un schéma décrit noms, ordre et types pour interpréter correctement chaque enregistrement.

Entrez dans le projet et vérifiez l’identité configurée :

cd /home/labex/project
aws sts \
  get-caller-identity

L’ARN se termine par labex-an01-operator. Vous utiliserez ses ressources S3 et Glue. Examinez le fichier September :

cat september.csv

Les trois ventes ont les champs order_id, region et total_cents. Les deux premiers sont des chaînes ; le montant est un entier en centimes. 1000, 2000 et 500 donnent 3500. Les valeurs ne sont pas entre guillemets, et il y a une seule ligne d’en-tête.

L’environnement fournit un bucket d’entrée au nom unique. jq -r extrait un champ JSON en texte et $(...) enregistre sa sortie dans une variable. Enregistrez et affichez le nom :

INPUT_BUCKET=$(jq -r .input_bucket resources.json)
echo "$INPUT_BUCKET"

Chargez vers sales/orders.csv. Le préfixe sales/ rassemble les données que lira la table :

aws s3 \
  cp september.csv "s3://$INPUT_BUCKET/sales/orders.csv"

Relisez directement l’objet chargé :

aws s3 \
  cp "s3://$INPUT_BUCKET/sales/orders.csv" -

Le - final affiche l’objet S3 dans le terminal. L’en-tête et les trois lignes doivent correspondre à september.csv. Dans AWS View, développez l’objet et comparez le contenu. Ne modifiez pas reference/notes.txt, situé hors de sales/.

Créer une base de données du catalogue

Dans cette étape, créez l’espace de noms de la définition de table. Une base Glue regroupe les tables du catalogue et stocke des métadonnées, sans exécuter de serveur de base de données. Sa création ne déplace pas le fichier S3.

Lisez le nom dans l’inventaire :

DATABASE=$(jq -r .database resources.json)
echo "$DATABASE"

--database-input accepte la définition JSON habituelle du nom et de la description :

aws glue \
  create-database \
  --database-input "{\"Name\":\"$DATABASE\",\"Description\":\"Sales CSV catalog\"}"

Une création réussie n’affiche pas de corps. Relisez la base pour confirmer son existence :

aws glue \
  get-database \
  --name "$DATABASE" \
  --query 'Database.{Name:Name,Description:Description}'

Le nom est labex_sales, avec votre description. AWS View montre la base encore sans table. Le fichier S3 reste à son emplacement initial.

Décrire le fichier avec une table externe

Dans cette étape, associez chaque champ CSV à un nom et un type, avec le véritable préfixe S3. Une table externe décrit des données hors du catalogue ; supprimer sa définition ne supprime pas les objets S3 eux-mêmes.

Le descripteur de stockage contient colonnes, emplacement et configuration de lecture. Un SerDe est un sérialiseur/désérialiseur qui interprète les lignes en champs. LazySimpleSerDe lit ici des valeurs non citées séparées par des virgules. L’en-tête n’est pas une vente : skip.header.line.count ignore la première ligne.

Enregistrez et affichez le préfixe de la table :

SALES_LOCATION=$(jq -r .input_location resources.json)
echo "$SALES_LOCATION"

cat > table.json <<EOF écrit le texte jusqu’au EOF final. Sans guillemets autour du délimiteur, $SALES_LOCATION est remplacé par votre véritable préfixe :

cat > table.json <<EOF
{
  "Name": "sales",
  "TableType": "EXTERNAL_TABLE",
  "StorageDescriptor": {
    "Columns": [
      {"Name": "order_id", "Type": "string"},
      {"Name": "region", "Type": "string"},
      {"Name": "total_cents", "Type": "int"}
    ],
    "Location": "$SALES_LOCATION",
    "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
    "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
    "SerdeInfo": {
      "SerializationLibrary": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
      "Parameters": {"field.delim": ","}
    }
  },
  "PartitionKeys": [],
  "Parameters": {"skip.header.line.count": "1", "classification": "csv"}
}
EOF

PartitionKeys est vide : cette première table lit un préfixe non partitionné. Les partitions mensuelles viendront ensuite. Les deux classes décrivent une entrée texte et une sortie ordinaire compatible Hive ; vous n’avez pas à les installer ou exécuter.

Créez la table avec ce JSON. file:// charge l’entrée CLI depuis un fichier local :

aws glue \
  create-table \
  --database-name "$DATABASE" \
  --table-input file://table.json

Relisez la définition depuis Glue :

aws glue \
  get-table \
  --database-name "$DATABASE" \
  --name sales \
  --query 'Table.{Name:Name,Columns:StorageDescriptor.Columns,Location:StorageDescriptor.Location,Parameters:Parameters}'

Confirmez l’ordre des colonnes, le type int de total_cents, la fin /sales/ de l’emplacement et la valeur 1 pour l’en-tête. AWS View affiche l’objet S3 et sa définition Glue côte à côte.

Exemple réel AWS View : CSV, colonnes Glue et emplacement S3 correspondent ; votre bucket aura un autre nom.

Le catalogue n’a ni modifié le CSV ni produit de résultat Athena. Un mauvais schéma ou emplacement ferait échouer les requêtes ou lire d’autres lignes. Des métadonnées correctes leur donnent une base fiable.

Résumé

Vous avez chargé les ventes réelles dans S3, créé une base Glue et défini une table externe dont les colonnes, le format CSV et l’emplacement correspondent. S3 conserve les données ; Glue, les métadonnées. Le prochain lab interroge avec Athena des données préparées indépendamment selon ce modèle.

Pour approfondir ce sujet, consultez la documentation AWS : Définir manuellement les métadonnées du catalogue; Champs CSV sans guillemets et gestion de l’en-tête.