Aller au contenu

Quiz 04 – Spark SQL et DataFrames : schéma, requêtes et partitionnement

  • Jour 1
  • 20 questions
  • Seuil de réussite : 70 %
  • 20 flashcards

Contenus évalués : Parquet contre CSV (format colonne, compression, schéma embarqué) ; vues temporaires avec `createOrReplaceTempView` et requêtes `spark.sql` ; SQLContext et HiveContext comme héritage ; schéma explicite avec `StructType` et types Parquet ; schéma explicite contre `inferSchema` ; DataFrame contre RDD et optimisation Catalyst ; SQL contre API DataFrame ; évaluation paresseuse d'une chaîne `join`, `groupBy`, `agg`, `orderBy` ; règles du `GROUP BY` ; lecture et interprétation des sorties `printSchema`, `show` et du chiffre d'affaires par heure ; écriture `partitionBy` et mode d'écriture ; mode ANSI, `try_divide` et moyenne avec valeurs nulles ; lecture de `explain()`, projection poussée vers Parquet et broadcast join.

Une seule bonne réponse par question. Toutes les valeurs citées sont celles des TP de la formation. Le corrigé détaillé s’affiche après la correction. Ce quiz prépare le QCM de validation des acquis du dernier jour.

Question 1

Dans le TP 4, tu lis data/trips.parquet plutôt que data/trips.csv. Pourquoi Parquet est-il plus rapide à lire que CSV ?

Question 2

Que fait cette ligne du TP 4 ?

trips.createOrReplaceTempView("trips")
Question 3

Le programme de la formation présente SQLContext et HiveContext comme de l'héritage. Dans le TP 4, quel objet sert de point d'entrée pour lire les fichiers, créer les vues et lancer spark.sql ?

Question 4

Voici un extrait du schéma explicite du corrigé :

schema = StructType([
    StructField("tpep_pickup_datetime", ...),
    StructField("PULocationID", IntegerType()),
    StructField("total_amount", DoubleType()),
])

Quel type le TP retient-il pour tpep_pickup_datetime, et pourquoi ?

Question 5

Avec spark.read.schema(schema).parquet(...), tu déclares IntegerType() pour une colonne stockée en INT64 dans le fichier Parquet. D'après le corrigé du TP 4, que se passe-t-il ?

Question 6

Au tour de table de fin de journée, on compare le top 10 du TP 2 (RDD, reduceByKey, join) à celui du TP 4 (DataFrame et SQL). Quelle réponse correspond à ce qui a été vu ?

Question 7

Voici le code de la question 4 du TP 4 :

par_borough = (trips.join(zones, trips.PULocationID == zones.LocationID)
               .groupBy("Borough")
               .agg(F.round(F.sum("total_amount"), 2).alias("ca"), F.count("*").alias("courses"))
               .orderBy(F.desc("ca")))
par_borough.show()

À quel moment Spark lit-il réellement les données et calcule-t-il le classement ?

Question 8

Le corrigé écrit les courses avec .withColumn("jour", F.to_date("tpep_pickup_datetime")).write.mode("overwrite").partitionBy("jour").parquet("out/trips_par_jour"). Tu obtiens 31 dossiers jour=…. Qu'est-ce qui détermine ce nombre ?

Question 9

Un collègue lance spark.sql("SELECT total_amount / trip_distance FROM trips").show(), sans WHERE. Aucune erreur n'apparaît, il en conclut que le mode ANSI est désactivé dans Spark 4. Quel est le bon diagnostic ?

Question 10

Dans le bonus 1, tu affiches top10.explain() et tu repères le mot Broadcast dans la jointure entre trips et zones. Que fait Catalyst ?

Question 11

Tu exécutes la première cellule du corrigé : lecture de data/trips.parquet avec le schéma explicite, puis trips.printSchema(). Que t'affiche Spark ?

Question 12

Dans le TP 4, trips est lu avec un schéma explicite, mais zones est lu avec spark.read.csv("data/taxi_zone_lookup.csv", header=True, inferSchema=True). Quelle justification tient la route ?

Question 13

Un participant simplifie la requête du top 10 :

SELECT z.Zone, z.Borough, ROUND(SUM(t.total_amount), 2) AS ca, COUNT(*) AS courses
FROM trips t JOIN zones z ON t.PULocationID = z.LocationID
GROUP BY z.Zone
ORDER BY ca DESC
LIMIT 10

Que se passe-t-il ?

Question 14

Pour la question 3b, tu tapes par_heure.show() au lieu de par_heure.show(24). La requête se termine par ORDER BY heure. Que vois-tu ?

Question 15

Le corrigé Scala écrit la requête par heure avec ORDER BY ca DESC, puis appelle .show(3). Quelles heures apparaissent, et dans quel ordre ?

Question 16

En voyant le pic de chiffre d'affaires à 18 h dans la question 3b, un collègue conclut : « À 18 h, les clients paient chaque course plus cher. » Quel est le bon diagnostic ?

Question 17

Dans le TP 4, le top 10 est écrit en SQL (question 3a) et le classement par arrondissement avec l'API DataFrame (question 4). Un participant demande s'il doit réécrire toutes ses requêtes SQL avec l'API DataFrame pour gagner en performance. Que lui réponds-tu ?

Question 18

Dans la sortie de top10.explain(), la ligne de lecture Parquet de trips ne mentionne que PULocationID et total_amount, alors que ton schéma explicite déclare 5 colonnes. Comment l'expliques-tu ?

Question 19

Le corrigé calcule le prix moyen par mile sur toutes les courses, sans WHERE :

SELECT ROUND(AVG(try_divide(total_amount, trip_distance)), 2) AS prix_moyen_par_mile FROM trips

Que deviennent les courses de distance nulle dans cette moyenne ?

Question 20

Tu relances la cellule d'écriture de la question 5 après avoir retiré à la fois shutil.rmtree(...) et .mode("overwrite"). Le dossier out/trips_par_jour existe déjà depuis ta première exécution. Que se passe-t-il ?

Cliquez sur une carte pour la retourner. Mélangez-les pour une révision active.

1 / 20

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.