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

Cómo compactar archivos pequeños en Lakehouse: paso a paso

João Barros 22 de August de 2026 4 min de lectura

Este tutorial muestra cómo compactar archivos pequeños (small files) en Lakehouse para reducir overhead de metadata y mejorar el rendimiento de lectura. Compactar archivos es útil en escenarios de ingestión continua o cuando pequeños archivos Delta degradan consultas y aumentan costes.

Requisitos previos

  • Cuenta con acceso a Microsoft Fabric y permisos para el Lakehouse.
  • Workspace con un Lakehouse que contenga tablas Delta con muchos archivos pequeños.
  • Entorno para ejecutar PySpark (notebook en Fabric o Synapse/Purview compatible).
  • Conocimientos básicos de Delta Lake y Spark SQL.

Paso 1: Identificar tablas con muchos archivos pequeños

Es importante saber qué tablas tienen muchos archivos pequeños. Una forma práctica es consultar el sistema de metadatos Delta para ver el número de archivos y el tamaño total.

-- Exemplo SQL no SQL endpoint ou notebook
DESCRIBE DETAIL delta.`/lakehouse///`;

Busque un tamaño total bajo por archivo (averageFileSize) o un número elevado de archivos (numFiles). Si averageFileSize es muy pequeño (por ej. < 10 MB), hay ganancia al compactar.

Paso 2: Planificación de la compactación (repartición/partitioning)

Decida el tamaño objetivo por archivo y si va a usar repartición por columna. Objetivo común: archivos entre 50 MB y 256 MB. Para tablas particionadas, compacte por partición para evitar shuffles innecesarios.

Paso 3: Compactar usando repartition/coalesce con PySpark

Este método lee la tabla Delta y la reescribe con menos archivos usando repartition o coalesce. Repartition crea shuffle (más preciso), coalesce reduce particiones sin shuffle (rápido cuando ya existe buena distribución).

from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

# Ler Delta table
df = spark.read.format("delta").load("/lakehouse///")

# Exemplo: target ~100 MB por ficheiro -> ajustar número de partições
# Calcula número de partições simples (opcional)
# num_partitions = max(1, int(total_size_bytes / (100 * 1024 * 1024)))

# Reparticionar e sobrescrever a mesma tabela (atenção à concorrência)
df.repartition(10).write.format("delta").mode("overwrite").option("dataChange", "false").save("/lakehouse///")

Nota: usar option("dataChange","false") cuando solo se reorganizan archivos sin alterar datos para mantener historial mínimo. Pruebe siempre en entorno no productivo.

Paso 4: Compactar por partición (cuando aplique)

Si la tabla está particionada por una columna (p. ej.: dt), compacte cada partición independientemente para evitar costosos shuffles.

# Exemplo PySpark por partição
from pyspark.sql.functions import col
partitions = [row['partition'] for row in spark.sql("SHOW PARTITIONS delta.`/lakehouse/<...>/`").collect()]
for p in partitions:
    part_path = f"/lakehouse////dt={p}"
    df_part = spark.read.format("delta").load(part_path)
    df_part.coalesce(1).write.format("delta").mode("overwrite").option("dataChange","false").save(part_path)

Elija coalesce(1) solo para particiones pequeñas; en caso contrario elija un número adecuado.

Paso 5: Compactación usando OPTIMIZE (si está disponible)

En entornos con soporte a comandos Delta OPTIMIZE (por ej. Databricks o Fabric con SQL endpoints), usar OPTIMIZE es la forma más simple e integrada.

-- Exemplo SQL
OPTIMIZE delta.`/lakehouse///`
ZORDER BY (coluna_importante);

OPTIMIZE compacta archivos y, con ZORDER, mejora la colocación de datos para consultas por columna. No todos los entornos soportan ZORDER.

Paso 6: Programar y automatizar la compactación

Después del proceso manual, automatice la tarea con un job programado (notebook job o pipeline). Ejecute la compactación fuera de horarios punta e incluya puntos de control y alertas.

# Exemplo de pseudocódigo para agendamento
# 1. Verificar tabelas com small files
# 2. Para cada tabela com averageFileSize < threshold -> executar compactação
# 3. Registar resultado e métricas

Verificar el resultado

Confirme la reducción del número de archivos y el aumento del tamaño medio por archivo usando DESCRIBE DETAIL o LIST en el sistema de archivos. Ejecute queries de lectura y compare tiempos antes/después y costes de lectura.

DESCRIBE DETAIL delta.`/lakehouse///`;
-- Ou listar ficheiros
ls /lakehouse////

Conclusión

Compactar archivos pequeños en Lakehouse mejora el rendimiento y reduce costes de I/O. Próximos pasos: automatizar con jobs, probar OPTIMIZE y monitorizar consultas. Consejo: empiece con una copia de prueba de la tabla antes de reescribir la producción — ¿qué partición o tamaño objetivo tendrá mayor impacto en su escenario?