(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo compactar y optimizar archivos Delta en Databricks: paso a paso

João Barros 28 de September de 2026 4 min de lectura

Aprende a compactar y optimizar archivos Delta en Databricks para reducir archivos pequeños (small files), mejorar I/O y acelerar consultas. Esta tarea es útil cuando cargas incrementales crean muchos archivos pequeños que perjudican el rendimiento de lectura y el coste de procesamiento.

Prerequisitos

  • Cuenta Databricks con workspace y cluster activo (Scala/Python soportado).
  • Tabla Delta existente o directorio Delta en DBFS con varios archivos pequeños.
  • Permisos de lectura/escritura en la tabla Delta o en la ruta DBFS.

Paso 1: Diagnosticar el problema de los small files

Antes de optimizar, conviene confirmar que existen muchos archivos pequeños y conocer el tamaño medio. Esto ayuda a decidir la estrategia de compactación y el objetivo de tamaño.

# Exemplo em PySpark num notebook Databricks
from pathlib import Path
from pyspark.sql.functions import col, input_file_name

path = '/mnt/data/delta/my_table'  # ou o caminho da tabela Delta
file_info = dbutils.fs.ls(path)
# Mostrar contagem e tamanhos
len_files = len(file_info)
sizes = [f.size for f in file_info if f.size is not None]
print(f"Ficheiros: {len_files}, tamanho médio: {sum(sizes)/len(sizes) if sizes else 0} bytes")

Paso 2: Usar OPTIMIZE para compactar archivos Delta

El comando OPTIMIZE agrupa archivos pequeños en archivos mayores por partición. Es sencillo y recomendado para tablas Delta gestionadas en Databricks. Puede ejecutarse en SQL en el notebook o vía spark.sql().

-- Exemplo SQL num notebook Databricks
OPTIMIZE delta.`/mnt/data/delta/my_table`;

-- Ou para uma tabela registada
OPTIMIZE my_database.my_table;

Paso 3: Usar ZORDER para consultas más rápidas por columnas específicas

ZORDER reorganiza físicamente los archivos para mejorar la colocalización de los valores de una columna (útil para filtros por fecha, id, geografía). Normalmente se usa después de OPTIMIZE o en conjunto.

-- Exemplo: optimizar por coluna de lookup 'customer_id'
OPTIMIZE my_database.my_table
ZORDER BY (customer_id);

-- Em Python, via spark.sql
spark.sql("OPTIMIZE my_database.my_table ZORDER BY (customer_id)")

Paso 4: Optimizar por partición adecuada y evitar repartition innecesaria

Particionar por columnas que reduzcan el volumen de datos leídos es importante. Si tu tabla no está particionada y los datos son grandes, considera una reescritura para añadir partición. Repartition excesiva puede crear de nuevo muchos archivos pequeños — usa coalesce cuando reduzcas particiones.

# Reescrever adicionando partição por 'year' e 'month' (exemplo mínimo)
df = spark.read.format("delta").load("/mnt/data/delta/my_table")
df_with_parts = df.withColumn('year', year(col('date'))).withColumn('month', month(col('date')))
df_with_parts.write.format("delta").mode("overwrite").partitionBy('year','month').save('/mnt/data/delta/my_table_partitioned')

# Para reduzir ficheiros sem mudar partições: coalesce antes de write
small_df = df.repartition(10)  # escolher número adequado
small_df.write.format("delta").mode("overwrite").option("overwriteSchema","true").save('/mnt/data/delta/my_table_compacted')

Paso 5: Automatizar con Workflows y evitar impactos en producción

Ejecutar OPTIMIZE/ZORDER en horarios controlados reduce impacto. Usa Databricks Workflows para programar mantenimiento y aplicar políticas (ej.: solo optimizar particiones con muchos archivos). También es posible limitar el scan con WHERE para optimizar particiones específicas.

-- Optimizar só uma partição (por exemplo year=2025)
OPTIMIZE my_database.my_table WHERE year = 2025 ZORDER BY (customer_id);

Verificar el resultado

Confirmar que el número de archivos disminuyó y que el tamaño medio aumentó. Medir el tiempo de consulta antes y después usando una query representativa. También verificar métricas del cluster (I/O y tiempo de lectura).

# Contar ficheiros após OPTIMIZE
file_info_after = dbutils.fs.ls('/mnt/data/delta/my_table')
print(f"Ficheiros depois: {len(file_info_after)}")

# Teste de consulta rápido
%sql
SELECT count(*) FROM my_database.my_table WHERE customer_id = 12345;

Conclusión

Compactar y optimizar archivos Delta en Databricks reduce archivos pequeños, mejora I/O y acelera consultas. Próximos pasos: programar OPTIMIZE con Databricks Workflows, experimentar ZORDER en columnas de filtro comunes y monitorizar latencia. Consejo: empieza por optimizar particiones hotspot y mide las ganancias antes de aplicar globalmente — ¿qué partición es la más crítica en tu caso?