Apprendre  /  Nouveautés

Les nouveautés d'Apache Spark 4.3 : état en temps réel, SCD Type 2 et ASOF JOIN

Spark 4.3 est la première version du nouveau calendrier trimestriel, et elle est riche : du streaming avec état en un dixième de seconde environ, des tables qui gardent l'historique sans MERGE écrit à la main, et une voie plus rapide pour les petites données. Nous l'avons installé et avons testé les principales nouveautés.

Nouveautés8 min de lectureMis à jour le 9 novembre 2026
PythonSQLDatabricksNouveautés
Tous les guides et antisèches

Apache Spark 4.3.0 est sorti le 30 octobre 2026, à peine trois mois et demi après Spark 4.2. Ce n'est pas un hasard : à partir de cette version, Spark publie une version fonctionnelle chaque trimestre au lieu de tous les six mois. Le 5 novembre, Databricks a annoncé qu'il est disponible dans Databricks Runtime 19. La version clôt plus de 1 100 tickets Jira de plus de 210 contributeurs. Voici les changements qui comptent pour les analystes et les data engineers, ainsi que ce que nous avons observé en exécutant PySpark 4.3 sur une petite machine à 2 cœurs.

141Millisecondes P99le plus lent de trois benchmarks avec état
1100Tickets Jiraclos dans cette version
210Contributeurset plus
3Moisentre deux versions fonctionnelles désormais

Real-Time Mode se souvient désormais

Real-Time Mode était arrivé dans les versions précédentes pour des flux simples, sans état. Dans la 4.3, il prend en charge les traitements qui ont besoin de mémoire : un compteur cumulé par appareil, la suppression d'événements en double ou un contrôle antifraude qui regarde les dernières transactions. Spark y parvient grâce à un nouveau modèle d'exécution : les étapes qui produisent et celles qui consomment tournent en même temps, reliées par un « shuffle en pipeline » qui transmet les enregistrements au fil de l'eau au lieu d'attendre la fin d'une étape entière. Le code reste du Structured Streaming ordinaire ; seul le déclencheur change.

Python
counts = events.groupBy("device_id").count()

query = (
    counts.selectExpr("CAST(device_id AS STRING) AS key",
                      "CAST(count AS STRING) AS value")
    .writeStream.format("kafka")
    .option("kafka.bootstrap.servers", "localhost:9092")
    .option("topic", "device-counts")
    .option("checkpointLocation", "/checkpoints/device-counts")
    .outputMode("update")
    .trigger(realTime="5 minutes")   # checkpoint interval, not latency
    .start()
)
Latence de bout en bout P99 dans Real-Time Mode de Spark 4.3
136 msdropDuplicates
139 msAgrégation par fenêtre
141 mstransformWithState

SCD Type 2 sans le casse-tête du MERGE

Une table d'« état actuel » vous dit où vit un client aujourd'hui, pas où il vivait quand il a passé commande. Conserver l'historique imposait d'écrire sa propre logique de MERGE. Spark 4.3 ajoute SCD Type 2 à Auto CDC dans les Spark Declarative Pipelines : chaque modification crée une nouvelle version de la ligne, avec des colonnes __START_AT et __END_AT qui indiquent sa période de validité.

SQL
CREATE STREAMING TABLE customer_history;

CREATE FLOW customer_history_cdc AS AUTO CDC INTO customer_history
FROM STREAM(customer_changes)
KEYS (customer_id)
SEQUENCE BY event_time
STORED AS SCD TYPE 2
TRACK HISTORY ON (status, region);

La même chose existe en Python avec stored_as_scd_type=2. Une condition : la table cible doit se trouver dans un catalogue qui prend en charge les opérations au niveau ligne, ce que ne font pas les simples tables Parquet. En pratique, cela veut dire Apache Iceberg avec Spark open source, ou des tables Delta sur Databricks.

Project Feather : Spark pour les petites données

Spark a toujours payé un coût fixe pour chaque requête : planification, répartition des tâches et shuffle des données entre elles. Sur un échantillon de 1 000 lignes, ce coût représente l'essentiel du temps. Project Feather commence à le supprimer. Avec un réglage, les petites requêtes qui lisent un seul petit fichier peuvent tourner en une seule tâche, sans shuffle.

Python
spark.conf.set("spark.sql.optimizer.singleTaskExecution.enabled", "true")
spark.read.parquet("small.parquet").groupBy("category").count().show()

Nous l'avons testé sur un fichier Parquet de 900 lignes. Le plan physique a perdu son étape Exchange et la plus rapide de huit exécutions est passée de 85 à 53 ms. À titre de comparaison, DuckDB 2.0 et Polars 2.1 ont répondu à la même requête en environ 1 ms, et le démarrage de la session Spark locale a pris 5,3 secondes. Feather rend Spark plus agréable pour tester du code sur des échantillons, notamment du code proposé par un assistant IA, mais il n'en fait pas un moteur pour portable. Notre comparatif DuckDB, Polars ou Spark donne tous les chiffres.

Améliorations du SQL

Transformez du JSON imbriqué en lignes et colonnes typées en une seule étape.

SQL
SELECT title, content
FROM JSON_TABLE(
  '{"sections":[{"title":"Returns","text":"Return within 30 days."},
                {"title":"Delivery","text":"Ships in 2 days."}]}',
  '$.sections[*]' COLUMNS (
    title   STRING PATH '$.title',
    content STRING PATH '$.text'
  )
) AS s;
-- Returns  | Return within 30 days.
-- Delivery | Ships in 2 days.

Autres nouveautés : UNNEST ANSI dans la clause FROM, le voyage dans le temps avec un @ après le nom de la table, COMMENT ON COLUMN, un type TIME jusqu'à la nanoseconde et des horodatages à la nanoseconde (TIMESTAMP_NTZ(9)) en aperçu à activer.

Petits changements à connaître

  • Lecture de fichiers dans des archives : CSV, JSON, Parquet et d'autres se lisent désormais directement dans des fichiers tar, zip et 7z (à activer).
  • DataFrame.zip combine deux sélections de colonnes d'un même DataFrame sans repasser par les RDD.
  • Spark Connect gagne des points d'accès REST pour lister sessions et opérations, des identifiants d'opération pour le traçage et un meilleur pilote JDBC qui gère ARRAY, MAP et STRUCT.
  • Lectures Parquet plus rapides et plusieurs améliorations de l'optimiseur, comme la génération de code pour UNION activée par défaut.
  • Expérimental : les UDF Python simples, comme len(), peuvent être traduites en expressions Spark natives.

Avant de mettre à jour

  1. 1

    Vérifiez Python

    Spark 4.3 abandonne Python 3.10 et exige NumPy 1.23.2 ou plus. Les images Docker officielles utilisent désormais Python 3.14.

  2. 2

    Lisez le guide de migration

    En mode ANSI, ceil et floor signalent désormais les dépassements, et spark.rdd.compress est activé par défaut.

  3. 3

    Vérifiez l'interface web

    Une politique de sécurité du contenu est désormais activée par défaut ; les plugins d'interface personnalisés peuvent nécessiter des ajustements.

  4. 4

    Activez les aperçus en connaissance de cause

    ASOF JOIN, BIN BY et les horodatages à la nanoseconde dépendent de réglages et peuvent changer.

  5. 5

    Sur Databricks, vérifiez votre runtime

    Databricks indique que Spark 4.3 est disponible dans le Runtime 19 ; confirmez la version de Spark dans les notes de version du runtime et testez les jobs sur une copie.

Testez vos connaissances

1/3À quel rythme Apache Spark publiera-t-il des versions fonctionnelles à partir de la 4.3 ?

2/3Qu'ajoute SCD Type 2 dans Auto CDC à une table ?

3/3Que se passe-t-il si vous lancez SQL ASOF JOIN dans Spark 4.3 sans changer de réglage ?

Pour aller plus loin : les nouveautés de Spark 4.2, l'aide-mémoire Spark SQL et PySpark et la mise à jour Databricks d'octobre 2026.

Sources : notes de version et actualités d'Apache Spark 4.3.0 (30 octobre 2026) ; blog Databricks, « Introducing Apache Spark 4.3, now available in Databricks Runtime 19 » (5 novembre 2026) ; nos propres tests avec PySpark 4.3.0 en mode local sur une machine à 2 cœurs, avec des temps purement indicatifs.

Alessandro Ecclesie AgazziÉcrit par Alessandro Ecclesie Agazzi, analytics engineer à Londres. Mis à jour le 9 novembre 2026. À propos

Cet article vous a été utile ?

De nouveaux guides et décryptages des nouveautés en data et en IA paraissent ici régulièrement. Suivez-moi sur LinkedIn ou partagez cet article avec un collègue.