Cómo particionar una tabla Delta en el Lakehouse de Fabric
Particionar una tabla Delta en el Lakehouse es una técnica sencilla que puede acelerar mucho las consultas cuando trabajas con grandes volúmenes de datos. La idea es guardar las filas en carpetas separadas por una columna —por ejemplo, el año— para que el motor lea solo la parte que necesita en lugar de recorrer la tabla entera. Es una buena forma de mejorar el rendimiento sin cambiar tu manera de escribir SQL. Funciona especialmente bien en tablas de hechos grandes, con millones de filas y un histórico de varios años.
Requisitos previos
- Un workspace de Microsoft Fabric con capacidad asignada.
- Un Lakehouse ya creado en tu workspace.
- Un notebook de Fabric conectado a ese Lakehouse, con Spark disponible.
- Una tabla o archivo con una columna adecuada para particionar (fecha, año, región…).
- Conocimientos básicos de PySpark y de SQL.
Paso 1: Elegir una buena columna de partición
Antes de escribir código, piensa bien en la columna. Una buena columna de partición tiene pocos valores distintos (baja cardinalidad) y aparece a menudo en los filtros de tus consultas. Las fechas agregadas —como el año o el mes— son las opciones clásicas. Evita particionar por columnas con miles de valores únicos, como un ID de cliente, porque eso crea miles de carpetas diminutas y, en vez de ayudar, lo vuelve todo más lento.
Regla práctica: procura que cada partición tenga un volumen razonable de datos (idealmente cientos de megabytes). Si cada carpeta tiene muy pocos archivos pequeños, estás particionando de más: elige una columna con menos valores.
Paso 2: Preparar la columna de partición
Si aún no tienes una columna simple para particionar, puedes crearla a partir de una fecha. En tu notebook, extrae el año de la columna de fecha con la función year:
from pyspark.sql.functions import year, col
# Lee los datos de origen (una tabla que ya existe en el Lakehouse)
df = spark.read.table("vendas")
# Crea la columna "ano" (año) a partir de la fecha de venta
df = df.withColumn("ano", year(col("data_venda")))
Ahora df tiene una columna ano con valores como 2024 o 2025, perfecta para usar como partición.
Paso 3: Guardar la tabla particionada
Guarda los datos como una tabla Delta e indica la columna de partición con partitionBy. Delta es el formato predeterminado en el Lakehouse, así que la tabla queda lista para consultarse con SQL de inmediato.
df.write.format("delta") \
.partitionBy("ano") \
.mode("overwrite") \
.saveAsTable("vendas_particionada")
Al guardar, Fabric crea una carpeta por cada valor de la columna —por ejemplo ano=2024 y ano=2025— y coloca en cada una solo las filas correspondientes. Usamos mode("overwrite") para (re)crear la tabla desde cero; si solo quisieras añadir datos nuevos, usarías mode("append").
Paso 4: Consultar aprovechando la partición
Cuando filtras por la columna de partición, el motor lee solo las carpetas necesarias. A esto se le llama partition pruning (poda de particiones) y es lo que hace la consulta más rápida.
SELECT ano, SUM(total) AS total_ano
FROM vendas_particionada
WHERE ano = 2025
GROUP BY ano;
Como filtraste por ano = 2025, el motor ignora todas las demás carpetas y lee solo esa partición. Cuantos más años tengas en la tabla, mayor es el ahorro.
Comprobar el resultado
Para confirmar que la tabla quedó realmente particionada, ejecuta el comando DESCRIBE DETAIL y observa el campo partitionColumns:
DESCRIBE DETAIL vendas_particionada;
En el resultado, partitionColumns debe mostrar ["ano"]. También puedes abrir el Lakehouse en el explorador de Fabric y expandir la tabla: verás las carpetas ano=2024, ano=2025, y así sucesivamente. Si esas carpetas aparecen y la consulta filtrada devuelve los números correctos, la partición está funcionando como debe.
Conclusión
En unos pocos pasos creaste una tabla Delta particionada en el Lakehouse y viste cómo el partition pruning acelera las consultas sin complicar tu SQL. Un buen siguiente paso es medir la diferencia: ejecuta la misma consulta en una tabla sin partición y en otra particionada y compara los tiempos. Después, combina la partición con el comando OPTIMIZE para mantener los archivos bien organizados. Y una pregunta para pensar: ¿cuál de tus tablas más grandes se beneficiaría ya de una buena columna de partición?