Apache Spark 4.3.0 salió el 30 de octubre de 2026, solo tres meses y medio después de Spark 4.2. No es casualidad: a partir de esta versión, Spark publica una versión de funcionalidades cada trimestre en lugar de cada seis meses. El 5 de noviembre Databricks anunció que está disponible en Databricks Runtime 19. La versión cierra más de 1.100 tickets de Jira de más de 210 colaboradores. Estos son los cambios que importan a analistas e ingenieros de datos, y lo que vimos al ejecutar PySpark 4.3 en una máquina pequeña de 2 núcleos.
Real-Time Mode ahora recuerda
Real-Time Mode llegó en versiones anteriores para flujos sencillos, sin estado. En la 4.3 se encarga de los trabajos que necesitan memoria: un recuento acumulado por dispositivo, eliminar eventos duplicados o una comprobación antifraude que mira las últimas transacciones. Spark lo consigue con un nuevo modelo de ejecución: las etapas que producen y las que consumen se ejecutan a la vez, conectadas por un "shuffle en pipeline" que pasa los registros según llegan en lugar de esperar a que termine una etapa entera. El código sigue siendo Structured Streaming normal; solo cambia el disparador.
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 sin el dolor de cabeza del MERGE
Una tabla de "estado actual" te dice dónde vive hoy un cliente, no dónde vivía cuando hizo un pedido. Conservar el historial obligaba a escribir tu propia lógica de MERGE. Spark 4.3 añade SCD Type 2 a Auto CDC en Spark Declarative Pipelines: cada cambio crea una nueva versión de la fila, con las columnas __START_AT y __END_AT que marcan cuándo era válida.
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 mismo existe en Python con stored_as_scd_type=2. Una condición: la tabla de destino debe estar en un catálogo que admita operaciones a nivel de fila, y las tablas Parquet simples no lo hacen. En la práctica significa Apache Iceberg con Spark de código abierto, o tablas Delta en Databricks.
Project Feather: Spark para datos pequeños
Spark siempre ha pagado un coste fijo por cada consulta: planificación, reparto de tareas y shuffle de datos entre ellas. Con una muestra de 1.000 filas, ese coste es casi todo el tiempo. Project Feather empieza a eliminarlo. Con un ajuste, las consultas pequeñas que leen un único archivo pequeño pueden ejecutarse como una sola tarea, sin shuffle.
spark.conf.set("spark.sql.optimizer.singleTaskExecution.enabled", "true")
spark.read.parquet("small.parquet").groupBy("category").count().show()Lo probamos con un archivo Parquet de 900 filas. El plan físico perdió su paso Exchange y la más rápida de ocho ejecuciones bajó de 85 a 53 ms. Como comparación, DuckDB 2.0 y Polars 2.1 respondieron a la misma consulta en alrededor de 1 ms, y arrancar la sesión local de Spark tardó 5,3 segundos. Feather hace Spark más cómodo para probar código con muestras, sobre todo código sugerido por un asistente de IA, pero no lo convierte en un motor de portátil. Nuestra comparación DuckDB frente a Polars frente a Spark tiene todas las cifras.
Mejoras en SQL
Convierte JSON anidado en filas y columnas con tipo en un solo paso.
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.Une cada fila con la última fila anterior, por ejemplo el precio en el momento de una operación. Está desactivado por defecto.
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;Sin el ajuste, Spark se detiene con el error UNSUPPORTED_FEATURE.ASOF_JOIN. Nuestra guía de ASOF JOIN muestra la misma consulta en Snowflake, DuckDB, Polars y pandas.
counter_diff: una función de ventana que convierte un contador acumulado en el cambio desde la fila anterior. En nuestra prueba devolvió NULL en la primera fila y cuando el contador se reiniciaba.jaro_winkler_similarity: similitud entre cadenas de 0 a 1, útil para coincidencias aproximadas ("Snowflake" y "Snowflak" dieron 0,98).collect_union,to_base32yfrom_base32.- Edición de VARIANT:
variant_set,variant_insert,variant_deleteyvariant_array_append.
También es nuevo: UNNEST ANSI en la cláusula FROM, el viaje en el tiempo con una @ tras el nombre de la tabla, COMMENT ON COLUMN, un tipo TIME hasta nanosegundos y marcas de tiempo con precisión de nanosegundo (TIMESTAMP_NTZ(9)) como vista previa opcional.
Cambios menores que conviene conocer
- Leer archivos dentro de comprimidos: CSV, JSON, Parquet y más se pueden leer directamente de archivos tar, zip y 7z (opcional).
- DataFrame.zip combina dos selecciones de columnas del mismo DataFrame sin recurrir a los RDD.
- Spark Connect gana endpoints REST para listar sesiones y operaciones, ID de operación para el seguimiento y un mejor controlador JDBC con ARRAY, MAP y STRUCT.
- Lecturas de Parquet más rápidas y varias mejoras del optimizador, como la generación de código para UNION activada por defecto.
- Experimental: las UDF de Python sencillas, como
len(), pueden traducirse a expresiones nativas de Spark.
Antes de actualizar
- 1
Revisa Python
Spark 4.3 deja Python 3.10 y necesita NumPy 1.23.2 o superior. Las imágenes Docker oficiales ya usan Python 3.14.
- 2
Lee la guía de migración
En modo ANSI, ceil y floor ahora dan errores de desbordamiento, y spark.rdd.compress está activado por defecto.
- 3
Revisa la interfaz web
Ahora hay una política de seguridad de contenido activada por defecto; los plugins de interfaz propios pueden necesitar cambios.
- 4
Activa las vistas previas a conciencia
ASOF JOIN, BIN BY y las marcas de tiempo en nanosegundos dependen de ajustes y pueden cambiar.
- 5
En Databricks, revisa tu runtime
Databricks dice que Spark 4.3 está disponible en el Runtime 19; confirma la versión de Spark en las notas del runtime y prueba los trabajos en una copia.
Pon a prueba lo que has aprendido
1/3¿Cada cuánto publicará Apache Spark versiones de funcionalidades a partir de la 4.3?
Spark 4.3 inaugura un ritmo trimestral de versiones de funcionalidades.
2/3¿Qué añade SCD Type 2 en Auto CDC a una tabla?
El historial se guarda en filas versionadas delimitadas por __START_AT y __END_AT.
3/3¿Qué pasa si ejecutas SQL ASOF JOIN en Spark 4.3 sin cambiar ningún ajuste?
ASOF JOIN es una vista previa; primero pon spark.sql.join.asofJoin.enabled a true.
Has acertado 0 de 3.
Sigue leyendo: las novedades de Spark 4.2, la chuleta de Spark SQL y PySpark y la actualización de Databricks de octubre de 2026.
Fuentes: notas de versión y noticias de Apache Spark 4.3.0 (30 de octubre de 2026); blog de Databricks, "Introducing Apache Spark 4.3, now available in Databricks Runtime 19" (5 de noviembre de 2026); nuestras propias pruebas con PySpark 4.3.0 en modo local en una máquina de 2 núcleos, con tiempos solo orientativos.
