Partie 4
Spark SQL
Interroger ses données avec des requêtes SQL.
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
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()Le même résultat que le groupBy de la partie 3 : Livres en tête avec 1060.
Les produits les plus vendus
En SQL, affichez les 5 produits vendus en plus grande quantité (somme de quantite).
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
spark.sql("""
SELECT produit, SUM(quantite) AS quantite_totale
FROM ventes
GROUP BY produit
ORDER BY quantite_totale DESC
LIMIT 5
""").show()BD en tête avec 729
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.
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
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()Carte en tête avec 229539.95
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.
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
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()Le client n°16 (Inès, Lille) arrive en tête avec 3316.49
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 ?
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
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()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.