Lab 1 : Transformations et actions sur les RDD

!pip install pyspark

Ouvrir dans Google Colab

Ce lab vous fait découvrir l’API RDD d’Apache Spark avec PySpark. Exécutez les cellules dans l’ordre avec Maj + Entrée. La première cellule installe PySpark.

Les cellules de code laissées vides sont prévues pour vos réponses. Pour comprendre le comportement d’une opération, observez à la fois son résultat et le type de dépendance entre les partitions.

Objectifs

Consultez la documentation PySpark sur les RDD au besoin.

Point d’entrée : SparkContext

SparkContext est le point d’entrée de l’API RDD. Il relie le programme au moteur Spark et permet notamment de créer des RDD.

Dans la cellule suivante, getOrCreate() récupère le contexte existant ou en crée un. En mode local, Spark exécute les tâches sur la machine qui héberge le notebook. Le parallélisme dépend du nombre de cœurs ou de threads configurés pour cette exécution.

from pyspark import SparkContext
sc = SparkContext.getOrCreate()

Partie 1 - Transformations et actions

Le jeu de données books contient un tuple par livre, sous la forme (titre, auteur, année de publication, genre, prix). Vous allez créer un RDD, le transformer, puis demander des résultats avec différentes actions.

books = [
    ("Les Misérables", "Victor Hugo", 1862, "Roman", 12.99),
    ("Le Rouge et le Noir", "Stendhal", 1830, "Roman", 9.99),
    ("Candide", "Voltaire", 1759, "Philosophie", 8.99),
    ("L'Étranger", "Albert Camus", 1942, "Roman", 10.99),
    ("Le Père Goriot", "Honoré de Balzac", 1834, "Roman", 7.99),
    ("Discours de la méthode", "René Descartes", 1637, "Philosophie", 15.99),
]

Question 1 - Créer un RDD

Créez un RDD nommé books_rdd à partir de la liste books.

Question 2 - Filtrer les livres publiés après 1900

À partir de books_rdd, utilisez filter pour conserver uniquement les livres publiés strictement après 1900, puis collect() pour afficher le résultat.

Question 3 - Extraire les titres

Utilisez map pour extraire le titre de chaque livre, puis collect() pour récupérer les titres dans le programme principal.

Répondez ensuite aux questions suivantes :

  1. map est-elle une transformation ou une action ?
  2. Sa dépendance est-elle étroite (narrow) ou large (wide) ?
  3. Que risque-t-on si le résultat de collect() est trop volumineux pour tenir dans la mémoire du driver ?

Question 4 - Compter les livres

Utilisez une action pour compter le nombre de livres dans le RDD.

  1. Cette opération est-elle une transformation ou une action ?
  2. Le résultat de cette action est-il un nouveau RDD ? Les données sont-elles conservées en mémoire automatiquement ?

Question 5 - Trouver les genres distincts

Utilisez distinct() pour obtenir les genres présents dans le jeu de données.

  1. distinct() est-elle une dépendance étroite (narrow) ou large (wide) ?
  2. Pourquoi cette opération peut-elle nécessiter un échange de données (shuffle) entre partitions ?

Partie 2 - Calculs de chiffre d’affaires

Le RDD sales_rdd contient un tuple par produit, sous la forme (produit, catégorie, chiffre d’affaires). Utilisez des transformations pour préparer les valeurs, puis une action pour obtenir chaque résultat.

sales_rdd = sc.parallelize(
    [("PDT 1", "CAT 1", 200),
     ("PDT 2", "CAT 1", 100),
     ("PDT 3", "CAT 2", 300),
     ("PDT 4", "CAT 2",  350),
    ("PDT 5", "CAT 2", 250)]
)

Données du problème

Les cinq produits sont répartis entre deux catégories. Le chiffre d’affaires est la troisième valeur de chaque tuple. Appuyez-vous sur la structure de ces tuples pour construire vos calculs.

Question 1 - Chiffre d’affaires de la catégorie 2

Calculez le chiffre d’affaires total des produits de la catégorie CAT 2.

Question 2 - Chiffre d’affaires par catégorie

Calculez le chiffre d’affaires total séparément pour chaque catégorie. Le résultat attendu comporte une valeur agrégée par catégorie.

Question 3 - Chiffre d’affaires moyen par produit

Calculez la moyenne des chiffres d’affaires des produits, c’est-à-dire la moyenne de la troisième valeur des tuples du RDD.