Fichiers

Partie 4

Spark SQL

Interroger ses données avec des requêtes SQL.

Étape 1 / 5
4.1
Guidé

Déclarer des tables SQL

Spark comprend le SQL. Il suffit de donner un nom de table à un DataFrame avec createOrReplaceTempView, puis d'écrire la requête dans spark.sql("..."). Le résultat est… un DataFrame, que l'on affiche avec show().

Rappel de la forme d'une requête : SELECT colonnes FROM table WHERE condition GROUP BY colonnes ORDER BY colonne DESC LIMIT n

Tapez ce code dans une nouvelle cellule, puis exécutez-le
ventes_propres.createOrReplaceTempView("ventes")
clients.createOrReplaceTempView("clients")

spark.sql("""
    SELECT categorie, COUNT(*) AS nb_ventes
    FROM ventes
    GROUP BY categorie
    ORDER BY nb_ventes DESC
""").show()
Résultat attendu
Le même résultat que le groupBy de la partie 3 : Livres en tête avec 1060.
4.2
Exercice

Les produits les plus vendus

En SQL, affichez les 5 produits vendus en plus grande quantité (somme de quantite).

À vous : complétez les « ... »
spark.sql("""
    SELECT produit, ... AS quantite_totale
    FROM ventes
    GROUP BY ...
    ORDER BY ...
    LIMIT 5
""").show()
Besoin d'un indice ?

SUM(quantite), GROUP BY produit, ORDER BY quantite_totale DESC

Voir la solution
Solution
spark.sql("""
    SELECT produit, SUM(quantite) AS quantite_totale
    FROM ventes
    GROUP BY produit
    ORDER BY quantite_totale DESC
    LIMIT 5
""").show()
Résultat attendu
BD en tête avec 729
4.3
Exercice

Le CA par mode de paiement

En SQL, calculez le CA pour chaque mode de paiement, arrondi à 2 décimales, du plus grand au plus petit. Rangez le résultat dans une variable ca_paiement_sql.

À vous : complétez les « ... »
ca_paiement_sql = spark.sql("""
    ...
""")
ca_paiement_sql.show()
Besoin d'un indice ?

SELECT mode_paiement, ROUND(SUM(montant), 2) AS ca FROM ventes GROUP BY ...

Voir la solution
Solution
ca_paiement_sql = spark.sql("""
    SELECT mode_paiement, ROUND(SUM(montant), 2) AS ca
    FROM ventes
    GROUP BY mode_paiement
    ORDER BY ca DESC
""")
ca_paiement_sql.show()
Résultat attendu
Carte en tête avec 229539.95
4.4
Exercice

Une jointure en SQL

Trouvez les 5 meilleurs clients (ceux qui ont dépensé le plus) avec leur id_client, prenom, ville et leur CA total.

À vous : complétez les « ... »
spark.sql("""
    SELECT c.id_client, c.prenom, c.ville, ... AS ca
    FROM ventes v
    JOIN clients c ON v.id_client = c.id_client
    GROUP BY ...
    ORDER BY ...
    LIMIT 5
""").show()
Besoin d'un indice ?

ROUND(SUM(v.montant), 2) et GROUP BY c.id_client, c.prenom, c.ville

Voir la solution
Solution
spark.sql("""
    SELECT c.id_client, c.prenom, c.ville, ROUND(SUM(v.montant), 2) AS ca
    FROM ventes v
    JOIN clients c ON v.id_client = c.id_client
    GROUP BY c.id_client, c.prenom, c.ville
    ORDER BY ca DESC
    LIMIT 5
""").show()
Résultat attendu
Le client n°16 (Inès, Lille) arrive en tête avec 3316.49
4.5
Exercice

SQL ou DataFrame ?

Réécrivez la requête « CA par mode de paiement » avec l'API DataFrame (groupBy, agg, orderBy), puis appelez .explain() sur les deux versions pour afficher leur plan d'exécution. Que constatez-vous ?

À vous : complétez les « ... »
ca_paiement_df = ventes_propres.groupBy(...).agg(...).orderBy(...)
ca_paiement_df.show()

ca_paiement_sql.explain()
ca_paiement_df.explain()
Besoin d'un indice ?

Même agrégation que pour le CA par catégorie, avec "mode_paiement".

Voir la solution
Solution
ca_paiement_df = (ventes_propres
                  .groupBy("mode_paiement")
                  .agg(F.round(F.sum("montant"), 2).alias("ca"))
                  .orderBy(F.desc("ca")))
ca_paiement_df.show()

ca_paiement_sql.explain()
ca_paiement_df.explain()
Résultat attendu
Les deux plans sont identiques : SQL et DataFrame passent par le même optimiseur. Choisissez la syntaxe que vous préférez.

Astuce : les flèches ← → du clavier permettent aussi de naviguer.