A escolha do formato de arquivo impacta diretamente performance, custo de storage e capacidade de governança em um data-lake-lakehouse. Existem dois níveis: formatos de arquivo (físico) e table formats (camada lógica sobre o físico).

Formatos de arquivo (físico)

Parquet

O formato mais comum em Data Lakes modernos. Colunar: armazena dados coluna a coluna, não linha a linha.

  • Excelente para queries analíticas que leem poucas colunas de muitas linhas
  • Compressão muito eficiente (Snappy, Gzip, Zstd)
  • Suporte nativo em Spark, Hive, Presto, BigQuery, Snowflake
  • Usar quando: analytics, Data Warehousing, camadas Silver e Gold
df.write.parquet("s3://lake/silver/pedidos/", compression="snappy")
df = spark.read.parquet("s3://lake/silver/pedidos/")

Avro

Formato orientado a linhas, otimizado para escrita e serialização de eventos.

  • Schema embutido no arquivo (em JSON/Avro IDL)
  • Ideal para streaming: Kafka usa Avro com Schema Registry por padrão
  • Evolução de schema suportada (adicionar campos sem quebrar consumidores)
  • Usar quando: ingestão de eventos, mensageria, camada Bronze vinda de Kafka

ORC (Optimized Row Columnar)

Formato colunar criado pelo ecossistema Hive.

  • Performance similar ao Parquet, mas com melhor integração nativa ao Hive
  • Suporte a índices embutidos (bloom filters, estatísticas por coluna)
  • Menos adotado fora do ecossistema Hadoop/Hive
  • Usar quando: workloads Hive-heavy ou legado Hadoop

Table Formats (camada lógica)

Table formats adicionam uma camada de metadados sobre arquivos Parquet/Avro/ORC, trazendo transações ACID, versionamento e schema evolution para o Data Lake.

Delta Lake

Desenvolvido pela Databricks, open-source desde 2019. Para operações avançadas (MERGE, OPTIMIZE, Z-ORDER, Liquid Clustering, CDF) ver databricks-delta-lake.

  • Transações ACID sobre arquivos Parquet no object storage
  • Time Travel: consulte versões anteriores da tabela
  • Schema enforcement e schema evolution
  • Suporte nativo no Databricks, integração com Spark
  • Usar quando: stack Databricks/Spark, arquitetura Medalhão
# Escrever como Delta
df.write.format("delta").mode("overwrite").save("s3://lake/silver/pedidos/")
 
# Time Travel
df_historico = spark.read.format("delta") \
    .option("versionAsOf", 3) \
    .load("s3://lake/silver/pedidos/")
 
# Histórico de operações
from delta.tables import DeltaTable
dt = DeltaTable.forPath(spark, "s3://lake/silver/pedidos/")
dt.history().show()

Apache Iceberg

Criado pelo Netflix, hoje um dos padrões abertos mais adotados.

  • Suporte a engines múltiplas: Spark, Flink, Trino, Presto, Hive, Dremio
  • Particionamento oculto (hidden partitioning), sem necessidade de passar partição nas queries
  • Evolução de schema e partição sem reescrever dados
  • Usar quando: ambiente multi-engine, migração de Hive, Lakehouse agnóstico de plataforma
-- Criar tabela Iceberg no Spark SQL
CREATE TABLE glue_catalog.db.pedidos (
  pedido_id BIGINT,
  cliente_id BIGINT,
  data_pedido DATE,
  valor_total DECIMAL(10,2)
)
USING iceberg
PARTITIONED BY (months(data_pedido));
 
-- Time Travel
SELECT * FROM db.pedidos VERSION AS OF 5;
SELECT * FROM db.pedidos TIMESTAMP AS OF '2026-01-01';

Apache Hudi (Hadoop Upserts Deletes and Incrementals)

Criado pelo Uber, focado em upserts eficientes e processamento incremental.

  • Dois tipos de tabela: Copy-on-Write (COW, melhor para leitura) e Merge-on-Read (MOR, melhor para escrita)
  • Excelente para CDC (Change Data Capture), replicando mudanças de bancos OLTP
  • Suporte a queries incrementais nativas
  • Usar quando: CDC de bancos relacionais, pipelines de upsert frequente

Comparativo rápido

FormatoTipoACIDTime TravelMulti-engineIdeal para
ParquetArquivoNãoNãoSimAnalytics geral
AvroArquivoNãoNãoSimStreaming / eventos
ORCArquivoNãoNãoParcialHive workloads
Delta LakeTable formatSimSimParcialStack Databricks/Spark
IcebergTable formatSimSimSimLakehouse multi-engine
HudiTable formatSimSimParcialCDC / upserts

Ver também: data-lake-lakehouse | arquitetura-medalhao | engenharia-de-dados