Scala PySpark Big Data en pratique : le code et les commandes qui comptent vraiment
Scala PySpark Big Data : l'essentiel en un article — vrai code, schémas et étapes concrètes, extraits d'un cours de 47 leçons.
Pas de théorie interminable ici : on ouvre le terminal et on pratique. Voici l'essentiel de Scala PySpark Big Data, extrait directement d'un cours complet de 47 leçons — avec du vrai code que tu peux copier-coller maintenant.
- Introduction aux Paradigmes de Programmation
- Installer l'environnement Big Data
- Découvrir le Big Data et Spark
- Fondamentaux de Scala
- Scala avancé pour Spark
Travaux pratiques Spark complets
spark-shell (Scala) et PySpark. Ce module est un laboratoire pratique guidé : vous tapez les commandes une par une et vous observez les résultats.Objectifs pédagogiques
- Spark installé (voir Chapitre 01)
- Le
spark-shellaccessible depuis votre terminal - Un dossier de travail (exemple :
C:/Users/user01/Desktop/SPARK/)
PARTIE 0 – Maîtriser le spark-shell (REPL)
spark-shell est un REPL (Read-Eval-Print Loop) : un terminal interactif où vous tapez une commande Scala, Spark l'exécute immédiatement, et affiche le résultat. C'est l'outil idéal pour apprendre et tester vos commandes Spark rapidement, sans avoir à créer un projet complet.spark-shell, Spark crée automatiquement deux variables pour vous :
spark: un objet SparkSession (le point d'entrée principal de Spark)sc: un objet SparkContext (utilisé pour créer des RDD)
import spark.implicits._ est déjà importé automatiquement (ce qui permet d'utiliser .toDF()).0.1 – Lancer le spark-shell
# Windows (PowerShell) : spark-shell # macOS / Linux : ./bin/spark-shell # Ou si Spark est dans votre PATH : spark-shell
http://localhost:4040. Si le port 4040 est occupé, Spark essaie 4041, 4042, etc. Cette interface vous permet de voir les jobs, les stages et les tâches en cours.0.2 – Premier test : créer un DataFrame
// Tapez ces commandes une par une dans le spark-shell :
scala> import spark.implicits._
// déjà importé automatiquement, mais utile si vous créez votre propre SparkSession
scala> val data = Seq(("Java", "20000"), ("Python", "100000"), ("Scala", "3000"))
// data: Seq[(String, String)] = List((Java,20000), (Python,100000), (Scala,3000))
scala> val df = data.toDF()
// df: org.apache.spark.sql.DataFrame = [_1: string, _2: string]
scala> df.show()
// +------+------+
// | _1| _2|
// +------+------+
// | Java| 20000|
// |Python|100000|
// | Scala| 3000|
// +------+------+_1 et _2 par défaut. Pour leur donner de vrais noms, utilisez .toDF("langage", "offres") :scala> val df = data.toDF("langage", "offres")
scala> df.show()
// +-------+------+
// |langage|offres|
// +-------+------+
// | Java| 20000|
// | Python|100000|
// | Scala| 3000|
// +-------+------+0.3 – Commandes spéciales du spark-shell
: (deux-points). Ces commandes ne sont pas du Scala, elles sont propres au REPL. Apprenez-les, elles vous feront gagner beaucoup de temps !// Afficher l'aide complète (liste de toutes les commandes spéciales) scala> :help
| Commande | Description | Exemple |
|---|---|---|
:help |
Affiche la liste de toutes les commandes disponibles | :help ou :he |
:paste |
Mode « coller » : permet de coller plusieurs lignes de code d'un coup. Terminez avec Ctrl+D. | :paste |
:load <fichier> |
Charge et exécute un fichier .scala ligne par ligne |
:load hello.scala |
:load -v <fichier> |
Charge un fichier en mode verbose (affiche chaque ligne exécutée) | :load -v hello.scala |
:quit |
Quitter le spark-shell proprement | :quit ou :q |
:history |
Affiche l'historique des commandes tapées | :history ou :history 20 |
:h? <mot> |
Rechercher un mot dans l'historique | :h? toDF |
:require <jar> |
Ajouter un fichier JAR au classpath pendant la session | :require /chemin/vers/mon.jar |
:type <expr> |
Affiche le type d'une expression sans l'exécuter | :type 1 + 2 → Int |
:imports |
Affiche tous les imports actifs dans la session | :imports |
:implicits |
Affiche les implicits disponibles | :implicits -v |
:reset |
Réinitialise le REPL (efface toutes les variables) | :reset |
:replay |
Réinitialise et rejoue toutes les commandes précédentes | :replay |
:save <fichier> |
Sauvegarde la session dans un fichier .scala |
:save ma_session.scala |
:sh <cmd> |
Exécute une commande shell (Unix/macOS uniquement) | :sh ls -la |
:silent |
Active/désactive l'affichage automatique des résultats | :silent |
:javap <class> |
Désassemble une classe Java / Scala | :javap scala.Int |
:paste ? — Dans le spark-shell, si vous collez du code multi-lignes directement, le REPL essaie d'exécuter chaque ligne séparément, ce qui provoque des erreurs. Le mode :paste permet de coller un bloc entier de code et de l'exécuter comme un tout.// Étape 1 : tapez :paste et appuyez sur Entrée
scala> :paste
// Entering paste mode (ctrl-D to finish)
// Étape 2 : collez votre code multi-lignes
val noms = Seq("Alice", "Bob", "Charlie")
val rdd = sc.parallelize(noms)
val majuscules = rdd.map(_.toUpperCase)
majuscules.collect()
// Étape 3 : appuyez sur Ctrl+D pour exécuter
// Exiting paste mode, now interpreting.
// noms: Seq[String] = List(Alice, Bob, Charlie)
// rdd: org.apache.spark.rdd.RDD[String] = ...
// majuscules: org.apache.spark.rdd.RDD[String] = ...
// res0: Array[String] = Array(ALICE, BOB, CHARLIE):paste, appuyez sur Ctrl+D. Si vous appuyez sur Ctrl+C, vous annulez le code collé..scala contenant des fonctions ou des traitements que vous voulez exécuter dans le spark-shell. Au lieu de tout recopier, utilisez :load.Étape 1 – Créer le fichier Scala :
# Windows (PowerShell) :
@"
println("Bonjour depuis le fichier Scala !")
val animaux = Seq("chat", "chien", "oiseau")
val rdd = sc.parallelize(animaux)
println("Nombre d'animaux : " + rdd.count())
rdd.collect().foreach(println)
"@ | Out-File -Encoding utf8 "C:\Users\user01\Desktop\SPARK\hello.scala"
# macOS / Linux :
cat > ~/Desktop/SPARK/hello.scala <<'EOF'
println("Bonjour depuis le fichier Scala !")
val animaux = Seq("chat", "chien", "oiseau")
val rdd = sc.parallelize(animaux)
println("Nombre d'animaux : " + rdd.count())
rdd.collect().foreach(println)
EOFPratique Spark SQL — AAPL & Income
AAPL.csv) et des données de revenus (income.csv) — en utilisant des case class, des RDD, des DataFrame et les fonctions d'agrégation Spark SQL.Table des matières
0. Présentation des données & téléchargement
0.1 – Fichier AAPL.csv (données boursières Apple)
AAPL.csv contient l'historique des cours de l'action Apple (NASDAQ : AAPL). Chaque ligne représente une journée de transaction.| Colonne | Type | Description | Exemple |
|---|---|---|---|
dt | String | Date de la transaction | 1984-09-07 |
openprice | Double | Prix d'ouverture de la journée | 25.50 |
highprice | Double | Prix le plus haut de la journée | 26.10 |
lowprice | Double | Prix le plus bas de la journée | 24.80 |
closeprice | Double | Prix de clôture de la journée | 25.90 |
volume | Double | Nombre d'actions échangées | 1234567.0 |
adjcloseprice | Double | Prix de clôture ajusté (dividendes, splits) | 25.85 |
AAPL.csv — 3 méthodes
Méthode 1 —
wget (recommandé, Windows/macOS/Linux)Télécharge directement le fichier brut depuis GitHub :
wget https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv
Invoke-WebRequest si wget n'est pas disponible :# PowerShell — télécharger AAPL.csv dans le dossier courant Invoke-WebRequest -Uri "https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv" -OutFile "AAPL.csv"
git clone (clone tout le dépôt)Clone le dépôt complet et récupère tous les fichiers de données :
# Cloner le dépôt inskillflow/data git clone https://github.com/inskillflow/data.git # Le fichier AAPL.csv sera dans : # data/AAPL.csv
- Ouvrez https://github.com/inskillflow/data/blob/main/AAPL.csv
- Cliquez sur le bouton « Raw » en haut à droite du fichier
- Faites Ctrl+S (ou Cmd+S sur Mac) pour sauvegarder la page sous le nom
AAPL.csv
https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv
AAPL.csv dans un dossier accessible, puis adaptez le chemin dans votre code :
- Windows :
C:\Users\VotreNom\Desktop\Spark\AAPL.csv - Linux / macOS :
/home/utilisateur/data/AAPL.csv - Spark Shell (chemin relatif) :
./AAPL.csv
0.2 – Fichier Income.csv (données de revenus)
| Colonne | Type | Description |
|---|---|---|
id | Double | Identifiant unique |
workclass | String | Catégorie d'emploi (Private, Self-emp, Gov...) |
education | String | Niveau d'éducation |
maritalstatus | String | Statut matrimonial |
occupation | String | Profession |
relationship | String | Relation familiale |
race | String | Origine ethnique |
gender | String | Genre |
nativecountry | String | Pays d'origine |
income | String | Tranche de revenu (<=50K ou >50K) |
age | Double | Âge de l'individu |
fnlwgt | Double | Poids de pondération statistique |
educationalnum | Double | Nombre d'années d'éducation |
capitalgain | Double | Gains en capital |
capitalloss | Double | Pertes en capital |
hoursperweek | Double | Heures de travail par semaine |
Income.csv — 3 méthodes
Méthode 1 —
wgetwget https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/Income.csv
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/Income.csv" -OutFile "Income.csv"
git clone (clone les deux fichiers en même temps)# Si vous avez déjà cloné le dépôt pour AAPL.csv, Income.csv est déjà présent # Sinon : git clone https://github.com/inskillflow/data.git # Le fichier Income.csv sera dans : data/Income.csv
Pattern matching et Options
Option[T] qui élimine les NullPointerException, et aller plus loin avec Either et les for-comprehensions.switch/case en Java ou d'un match en Python 3.10+, mais en beaucoup plus puissant. Si vous connaissez déjà if/elif/else en Python, vous comprendrez sans difficulté. Scala ajoute la possibilité de vérifier des types, d'extraire des données d'objets et de poser des conditions — le tout dans une syntaxe claire et compacte.Objectifs pédagogiques
1. L'analogie du tri postal
Imaginez un centre de tri postal. Chaque lettre arrive sur un tapis roulant. Un employé regarde l'adresse et envoie la lettre dans la bonne boîte : Paris à gauche, Lyon à droite, Marseille tout droit. Si l'adresse ne correspond à rien de connu, la lettre part dans une boîte « Autres ».
Le pattern matching fonctionne exactement comme ce tri postal : on examine une valeur, on la compare à plusieurs modèles (patterns), et on exécute le code associé au premier modèle qui correspond.
if/else — Le pattern matching est plus lisible, plus sûr (le compilateur vérifie que tous les cas sont couverts avec les sealed trait) et bien plus puissant, car il peut déconstruire des objets complexes, extraire des valeurs, et combiner type + valeur + condition dans un seul case.2. La syntaxe match/case
L'expression match prend une valeur et la compare à une série de clauses case. La première clause qui correspond est exécutée. Contrairement au switch Java, il n'y a pas de break à écrire — Scala s'arrête automatiquement au premier cas correspondant.
match est une expression, pas une instruction. Cela signifie qu'il retourne toujours une valeur. On peut donc écrire val x = valeur match { ... }.Exemple 1 : les jours de la semaine
val jour = "Mercredi"
val typeJour = jour match {
case "Lundi" | "Mardi" | "Mercredi" | "Jeudi" | "Vendredi" =>
"Jour ouvré"
case "Samedi" | "Dimanche" =>
"Week-end"
case _ =>
"Jour inconnu" // _ = la boîte "Autres" du tri postal
}
println(typeJour) // "Jour ouvré"_ — Le symbole _ (underscore) correspond à « tout le reste ». Il doit toujours être placé en dernier, car il attrape tout. Sans lui, si aucun case ne correspond, Scala lève une exception MatchError à l'exécution.Exemple 2 : convertir une note en mention
val note = 15
val mention = note match {
case 20 => "Parfait"
case 16 | 17 | 18 | 19 => "Très bien"
case 14 | 15 => "Bien"
case 12 | 13 => "Assez bien"
case 10 | 11 => "Passable"
case _ => "Insuffisant"
}
println(mention) // "Bien"En Java ou Python, un switch ou match est une instruction : il fait quelque chose mais ne retourne pas de valeur directement. En Scala, match est une expression : il retourne toujours une valeur.
Ce que ça change concrètement :
// Scala : match est une expression, on peut l'assigner directement
val categorie = age match {
case a if a < 18 => "Mineur"
case a if a < 65 => "Adulte"
case _ => "Senior"
}
// On peut aussi l'utiliser comme argument d'une fonction
println(age match {
case a if a < 18 => "Mineur"
case _ => "Adulte"
})
// Ou dans une interpolation de string
val message = s"Statut : ${age match {
case a if a < 18 => "Mineur"
case _ => "Adulte"
}}"// Java : le switch (avant Java 14) ne retourne pas de valeur
// Il fallait écrire :
String categorie;
switch (age) {
case ...: categorie = "Mineur"; break;
default: categorie = "Adulte";
}
// Java 14+ a ajouté les switch expressions pour combler ce manquematch retourne une valeur, le compilateur vérifie que tous les branches retournent le même type. Si un case retourne un String et un autre un Int, Scala infère le type commun (Any). C'est souvent signe d'une erreur de conception.# Python 3.10+ structural pattern matching
jour = "Mercredi"
match jour:
case "Lundi" | "Mardi" | "Mercredi" | "Jeudi" | "Vendredi":
type_jour = "Jour ouvre"
case "Samedi" | "Dimanche":
type_jour = "Week-end"
case _:
type_jour = "Jour inconnu"
# Difference : en Python, match est une instruction (pas d'assignation directe)
# En Scala : val x = valeur match { ... } <-- expression qui retourne une valeur
# En Python : vous devez assigner dans chaque branche manuellement# Python < 3.10 : pas de match/case, on utilise if/elif/else
jour = "Mercredi"
if jour in ("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"):
type_jour = "Jour ouvre"
elif jour in ("Samedi", "Dimanche"):
type_jour = "Week-end"
else:
type_jour = "Jour inconnu"Cet article couvre les extraits les plus utiles — le cours complet Scala PySpark Big Data (13 chapitres, 47 leçons, exercices corrigés et projet final) t'emmène jusqu'au bout.
./acceder-au-cours-complet cours gratuit : Maîtriser Claude CodeFAQ
Combien de temps pour apprendre Scala PySpark Big Data ?
Faut-il des prérequis ?
Par où commencer concrètement ?
📬 Tu veux recevoir ce type de guide chaque semaine ? Abonne-toi gratuitement — code réel, zéro blabla.