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

Como compactar e otimizar ficheiros Delta em Databricks: passo a passo

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

Aprende a compactar e optimizar ficheiros Delta em Databricks para reduzir ficheiros pequenos (small files), melhorar I/O e acelerar consultas. Esta tarefa é útil quando cargas incrementais criam muitos ficheiros pequenos que prejudicam o desempenho de leitura e o custo de processamento.

Pré-requisitos

  • Conta Databricks com workspace e cluster ativo (Scala/Python suportado).
  • Tabela Delta existente ou diretório Delta em DBFS com vários ficheiros pequenos.
  • Permissões de leitura/escrita na tabela Delta ou no caminho DBFS.

Passo 1: Diagnosticar o problema dos small files

Antes de optimizar, convém confirmar que existem muitos ficheiros pequenos e saber o tamanho médio. Isto ajuda a decidir a estratégia de compactação e o objetivo de tamanho.

# 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")

Passo 2: Usar OPTIMIZE para compactar ficheiros Delta

O comando OPTIMIZE agrupa ficheiros pequenos em ficheiros maiores por partição. É simples e recomendado para tabelas Delta geridas em Databricks. Pode ser executado em SQL no notebook ou via spark.sql().

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

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

Passo 3: Usar ZORDER para consultas mais rápidas por colunas específicas

ZORDER reorganiza fisicamente os ficheiros para melhorar a colocalização dos valores de uma coluna (útil para filtros por data, id, geografia). Normalmente usa-se após OPTIMIZE ou em 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)")

Passo 4: Optimizar por partição adequada e evitar repartition desnecessária

Particionar por colunas que reduzam o volume de dados lido é importante. Se a tua tabela não estiver particionada e os dados forem grandes, considera uma reescrita para adicionar partição. Repartition excessiva pode criar de novo muitos ficheiros pequenos — usa coalesce quando reduzir partições.

# 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')

Passo 5: Automatizar com Workflows e evitar impactos em produção

Executar OPTIMIZE/ZORDER em horários controlados reduz impacto. Usa Databricks Workflows para agendar manutenção e aplicar políticas (ex.: só optimizar partições com muitos ficheiros). Também é possível limitar o scan com WHERE para optimizar partições específicas.

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

Verificar o resultado

Confirmar que o número de ficheiros diminuiu e que o tamanho médio aumentou. Medir o tempo de consulta antes e depois usando uma query representativa. Também verificar métricas do cluster (I/O e tempo de leitura).

# 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;

Conclusão

Compactar e optimizar ficheiros Delta em Databricks reduz ficheiros pequenos, melhora I/O e acelera consultas. Próximos passos: agendar OPTIMIZE com Databricks Workflows, experimentar ZORDER em colunas de filtro comuns e monitorizar latência. Dica: começa por optimizar partições hotspot e mede os ganhos antes de aplicar globalmente — qual partição é a mais crítica no teu caso?