TP 1 – Premier contact avec Spark 4
Objectif : avoir une SparkSession qui fonctionne, charger le fil rouge et lire la Spark UI.
Ouvrez le notebook depuis la racine du dépôt : les chemins sont relatifs à
data/. La première cellule remonte automatiquement jusqu’au dossier qui contientdata/.
1. Créer une SparkSession en local, avec tous les cœurs
Section intitulée « 1. Créer une SparkSession en local, avec tous les cœurs »from pyspark.sql import SparkSessionspark = (SparkSession.builder .appName("TP") .master("local[*]") .getOrCreate())sc = spark.sparkContextprint("Spark", spark.version, "—", spark.sparkContext.uiWebUrl)2. Charger data/trips.csv (avec en-tête) et compter les lignes
Section intitulée « 2. Charger data/trips.csv (avec en-tête) et compter les lignes »Indice : spark.read.csv(chemin, header=True, inferSchema=True) puis .count().
3. Afficher le schéma et 5 lignes
Section intitulée « 3. Afficher le schéma et 5 lignes »Indice : printSchema(), puis
df.select("tpep_pickup_datetime", "PULocationID", "trip_distance", "total_amount").show(5).
4. Ouvrir la Spark UI, onglet Jobs
Section intitulée « 4. Ouvrir la Spark UI, onglet Jobs »- Combien de jobs voyez-vous ?
inferSchema=Truerelit le fichier pour deviner les types : la lecture crée elle-même des jobs, avant votrecount(). Avecheader=True, Spark lance aussi un petit job pour lire la première ligne. - Cliquez sur le job du
count(): il a 2 stages (un compte par partition, puis l’addition des comptes). Combien de tâches dans le premier ? Comparez avecdf.rdd.getNumPartitions(). - Si le port 4040 est déjà pris (un autre notebook ouvert), Spark utilise 4041 : le bon lien est
spark.sparkContext.uiWebUrl.
Bonus – CSV ou Parquet ?
Section intitulée « Bonus – CSV ou Parquet ? »Chronométrez un count() sur data/trips.csv puis sur data/trips.parquet. Lequel est le plus rapide, et
pourquoi ? (Format colonne, compressé, schéma embarqué : pas d’inférence.)
🔍 Comprendre sous le capot : Pourquoi voyez-vous 3 jobs dans la Spark UI alors que vous n'avez écrit qu'un seul .count() ?
Quand vous exécutez spark.read.csv("data/trips.csv", header=True, inferSchema=True) suivi de df.count(), ouvrez http://localhost:4040 : vous voyez 3 jobs distincts !
- Job 0 (
csv at ...) — Lecture de l’en-tête (header=True) : Spark lance un mini-job d’une seule tâche qui ne lit que la 1re ligne du fichier pour connaître le nom des 19 colonnes (VendorID,tpep_pickup_datetime…). - Job 1 (
csv at ...) — Inférence du schéma (inferSchema=True) : un fichier CSV est du pur texte. Pour deviner quetrip_distanceest undoubleetPULocationIDunint, Spark est obligé de parcourir tout le fichier une première fois ! - Job 2 (
count at ...) — Votre actiondf.count(): Spark parcourt enfin le fichier pour compter les 120 000 lignes (en 2 stages : chaque tâche compte sa partition, puis un second stage additionne les sous-totaux).
Sur data/trips.parquet : le nom et le type des colonnes, ainsi que le nombre exact de lignes, sont déjà écrits dans le pied de page (footer) binaire du fichier Parquet. Spark n’a besoin d’aucun job d’inférence et répond quasi instantanément !
Pièges rencontrés en séance
Section intitulée « Pièges rencontrés en séance »| Symptôme | Cause | Solution |
|---|---|---|
PATH_NOT_FOUND … jour1/data/trips.csv | Le chemin relatif est résolu depuis jour1/ | Exécuter la première cellule, ou ouvrir le notebook depuis la racine |
Colonnes _c0 à _c18, 120 001 lignes | header=True oublié | L’en-tête a été lu comme une donnée |
Toutes les colonnes en string | inferSchema absent | Normal : sans inférence, Spark ne devine aucun type |
sc.master reste local[*] après avoir demandé local[2] | getOrCreate() renvoie la session déjà active | spark.stop() ou redémarrer le noyau |
ModuleNotFoundError: pyspark dans VS Code (WSL2) | VS Code utilise le Python de Windows | Extension WSL, « Connect to WSL », choisir le noyau du .venv |
Correction en direct
Section intitulée « Correction en direct »Le corrigé est publié en fin de journée (voir l’encadré « Dans le dépôt » en haut de page). Il existe en deux
formes : le notebook, pour relire pas à pas, et le script .py, exécutable d’un bloc. Attention : le script se
termine par spark.stop(), donc son lien Spark UI ne mène plus à rien une fois le script terminé. Pour explorer les
jobs, gardez votre session ouverte dans le notebook.
Dépôt des participants : formations2026/formation-spark-ml (branche participants)
Contenu pédagogique © Ambient IT · 140 Avenue Jean Lolive, 93500 Pantin · formation@ambient-it.net · +33 (0)1 48 10 09 46
Organisme de formation enregistré sous le numéro 11 75 54743 75. Cet enregistrement ne vaut pas agrément de l'État.