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.
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.
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()
)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é.
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.
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.
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.Associez chaque ligne à la dernière ligne antérieure, par exemple le prix au moment d'une transaction. Désactivé par défaut.
SET spark.sql.join.asofJoin.enabled = true;
SELECT t.trade_id, q.price
FROM trades AS t
LEFT ASOF JOIN quotes AS q
MATCH_CONDITION (t.ts >= q.ts)
ON t.sym = q.sym;Sans le réglage, Spark s'arrête avec l'erreur UNSUPPORTED_FEATURE.ASOF_JOIN. Notre guide d'ASOF JOIN montre la même requête dans Snowflake, DuckDB, Polars et pandas.
counter_diff: une fonction de fenêtre qui transforme un compteur cumulé en variation depuis la ligne précédente. Dans notre test, elle a renvoyé NULL pour la première ligne et lors d'une remise à zéro du compteur.jaro_winkler_similarity: similarité entre chaînes de 0 à 1, utile pour les rapprochements approximatifs (« Snowflake » et « Snowflak » donnent 0,98).collect_union,to_base32etfrom_base32.- Modification des VARIANT :
variant_set,variant_insert,variant_deleteetvariant_array_append.
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
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
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
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
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
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 ?
Spark 4.3 inaugure un rythme trimestriel pour les versions fonctionnelles.
2/3Qu'ajoute SCD Type 2 dans Auto CDC à une table ?
L'historique est conservé dans des lignes versionnées bornées par __START_AT et __END_AT.
3/3Que se passe-t-il si vous lancez SQL ASOF JOIN dans Spark 4.3 sans changer de réglage ?
ASOF JOIN est un aperçu ; mettez d'abord spark.sql.join.asofJoin.enabled à true.
Vous avez 0 bonne(s) réponse(s) sur 3.
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.
