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
| Formato | Tipo | ACID | Time Travel | Multi-engine | Ideal para |
|---|---|---|---|---|---|
| Parquet | Arquivo | Não | Não | Sim | Analytics geral |
| Avro | Arquivo | Não | Não | Sim | Streaming / eventos |
| ORC | Arquivo | Não | Não | Parcial | Hive workloads |
| Delta Lake | Table format | Sim | Sim | Parcial | Stack Databricks/Spark |
| Iceberg | Table format | Sim | Sim | Sim | Lakehouse multi-engine |
| Hudi | Table format | Sim | Sim | Parcial | CDC / upserts |
Ver também: data-lake-lakehouse | arquitetura-medalhao | engenharia-de-dados