Apache Spark 4.3.0 è uscito il 30 ottobre 2026, appena tre mesi e mezzo dopo Spark 4.2. Non è un caso: da questa versione Spark pubblica una release di funzionalità ogni trimestre invece che ogni sei mesi. Il 5 novembre Databricks ha annunciato che è disponibile in Databricks Runtime 19. La release chiude oltre 1.100 ticket Jira da più di 210 contributori. Ecco le novità che contano per chi analizza dati e per i data engineer, più quello che abbiamo visto eseguendo PySpark 4.3 su una piccola macchina con 2 core.
Real-Time Mode ora ricorda
Real-Time Mode era arrivato nelle versioni precedenti per flussi semplici, senza stato. Nella 4.3 gestisce i lavori che hanno bisogno di memoria: un conteggio progressivo per dispositivo, la rimozione di eventi duplicati o un controllo antifrode che guarda le ultime transazioni. Spark ci riesce con un nuovo modello di esecuzione: le fasi che producono e quelle che consumano girano contemporaneamente, collegate da uno "shuffle in pipeline" che passa i record man mano che arrivano invece di aspettare la fine di un'intera fase. Il codice resta normale Structured Streaming; cambia solo il trigger.
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 senza il mal di testa del MERGE
Una tabella con lo "stato attuale" ti dice dove vive un cliente oggi, non dove viveva quando ha fatto un ordine. Conservare la storia significava scrivere da sé la logica di MERGE. Spark 4.3 aggiunge SCD Type 2 ad Auto CDC nelle Spark Declarative Pipelines: ogni modifica crea una nuova versione della riga, con le colonne __START_AT e __END_AT che indicano quando era valida.
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);Lo stesso è disponibile in Python con stored_as_scd_type=2. Una condizione: la tabella di destinazione deve stare in un catalogo che supporta operazioni a livello di riga, e le semplici tabelle Parquet non lo fanno. In pratica significa Apache Iceberg con Spark open source, o tabelle Delta su Databricks.
Project Feather: Spark per i dati piccoli
Spark ha sempre pagato un costo fisso per ogni query: pianificazione, assegnazione dei task e shuffle dei dati tra di essi. Su un campione di 1.000 righe quel costo è quasi tutto il tempo. Project Feather inizia a eliminarlo. Con un'impostazione, le query piccole che leggono un solo file piccolo possono girare come un unico task, senza shuffle.
spark.conf.set("spark.sql.optimizer.singleTaskExecution.enabled", "true")
spark.read.parquet("small.parquet").groupBy("category").count().show()L'abbiamo provato su un file Parquet di 900 righe. Il piano fisico ha perso il passaggio Exchange e la più veloce di otto esecuzioni è scesa da 85 a 53 ms. Per confronto, DuckDB 2.0 e Polars 2.1 hanno risposto alla stessa query in circa 1 ms, e avviare la sessione Spark locale ha richiesto 5,3 secondi. Feather rende Spark più comodo per provare il codice su campioni, soprattutto codice suggerito da un assistente AI, ma non trasforma Spark in un motore da portatile. Il nostro confronto DuckDB contro Polars contro Spark ha tutti i numeri.
Miglioramenti all'SQL
Trasforma JSON annidato in righe e colonne tipizzate in un solo passaggio.
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.Abbina ogni riga all'ultima riga precedente, per esempio il prezzo al momento di una transazione. È disattivato per impostazione predefinita.
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;Senza l'impostazione, Spark si ferma con l'errore UNSUPPORTED_FEATURE.ASOF_JOIN. La nostra guida ad ASOF JOIN mostra la stessa query in Snowflake, DuckDB, Polars e pandas.
counter_diff: una funzione finestra che trasforma un contatore progressivo nella variazione rispetto alla riga precedente. Nel nostro test ha restituito NULL per la prima riga e quando il contatore si azzerava.jaro_winkler_similarity: somiglianza tra stringhe da 0 a 1, utile per gli abbinamenti approssimati ("Snowflake" e "Snowflak" danno 0,98).collect_union,to_base32efrom_base32.- Modifica dei VARIANT:
variant_set,variant_insert,variant_deleteevariant_array_append.
Altre novità: UNNEST ANSI nella clausola FROM, il time travel con una @ dopo il nome della tabella, COMMENT ON COLUMN, un tipo TIME fino ai nanosecondi e timestamp con precisione al nanosecondo (TIMESTAMP_NTZ(9)) come anteprima da attivare.
Piccole modifiche da conoscere
- Lettura di file dentro gli archivi: CSV, JSON, Parquet e altri si possono leggere direttamente da file tar, zip e 7z (da attivare).
- DataFrame.zip unisce due selezioni di colonne dello stesso DataFrame senza ricorrere agli RDD.
- Spark Connect ottiene endpoint REST per elencare sessioni e operazioni, ID delle operazioni per il tracciamento e un driver JDBC migliore con supporto ad ARRAY, MAP e STRUCT.
- Letture Parquet più veloci e diversi miglioramenti all'ottimizzatore, come la generazione di codice per UNION attiva di default.
- Sperimentale: le UDF Python semplici, come
len(), possono essere tradotte in espressioni native di Spark.
Prima di aggiornare
- 1
Controlla Python
Spark 4.3 abbandona Python 3.10 e richiede NumPy 1.23.2 o successivo. Le immagini Docker ufficiali ora usano Python 3.14.
- 2
Leggi la guida alla migrazione
In modalità ANSI ceil e floor ora segnalano errori di overflow, e spark.rdd.compress è attivo di default.
- 3
Controlla l'interfaccia web
Una content security policy ora è attiva di default; i plugin personalizzati dell'interfaccia potrebbero richiedere modifiche.
- 4
Attiva le anteprime consapevolmente
ASOF JOIN, BIN BY e i timestamp al nanosecondo dipendono da impostazioni e possono cambiare.
- 5
Su Databricks, controlla il runtime
Databricks dice che Spark 4.3 è disponibile nel Runtime 19; verifica la versione di Spark nelle note di rilascio del runtime e prova i job su una copia.
Verifica cosa hai capito
1/3Ogni quanto Apache Spark pubblicherà release di funzionalità dalla 4.3 in poi?
Spark 4.3 inaugura un ritmo trimestrale per le release di funzionalità.
2/3Cosa aggiunge a una tabella SCD Type 2 in Auto CDC?
La storia è conservata in righe versionate delimitate da __START_AT e __END_AT.
3/3Cosa succede se esegui SQL ASOF JOIN in Spark 4.3 senza cambiare impostazioni?
ASOF JOIN è un'anteprima; prima imposta spark.sql.join.asofJoin.enabled a true.
Hai risposto correttamente a 0 domande su 3.
Continua a leggere: le novità di Spark 4.2, la guida rapida a Spark SQL e PySpark e l'aggiornamento di Databricks di ottobre 2026.
Fonti: note di rilascio e notizie di Apache Spark 4.3.0 (30 ottobre 2026); blog di Databricks, "Introducing Apache Spark 4.3, now available in Databricks Runtime 19" (5 novembre 2026); nostri test con PySpark 4.3.0 in modalità locale su una macchina con 2 core, con tempi solo indicativi.
