Formatos de Arquivo
Formatos colunares (Parquet, Arrow) dominam pipelines de análise: comprimem bem, embutem esquema e permitem que leitores carreguem apenas as colunas necessárias.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import pandas as pd
df = pd.read_csv("orders.csv", parse_dates=["ordered_at"])
df.to_parquet(
"lake/orders/dt=2025-01-15/data.parquet",
index=False,
compression="zstd",
)
# Ler de volta colunas selecionadas
subset = pd.read_parquet("lake/orders", columns=["order_id", "revenue"], filters=[("dt", ">=", "2025-01-01")]Quando usar isso:
- Camadas raw e mart do Lakehouse em armazenamento de objetos
- Transição entre Python, Spark, Polars e DuckDB
- Redução de custo de armazenamento vs gzip CSV
- Evolução de esquema com colunas documentadas
Exemplo de Trabalho
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
from pathlib import Path
df = pd.DataFrame(
{
"order_id": [1, 2, 3],
"region"
O que isso demonstra:
- Diretório de partição Hive
dt=AAAA-MM-DD - Arrow como intercâmbio entre pandas e o escritor Parquet
- Inspeção de metadados para verificações operacionais
- Poda de colunas na leitura
Mergulho Profundo
Como Funciona
- Parquet armazena blocos de colunas com estatísticas (mínimo/máximo) por grupo de linhas.
- Arrow define o layout em memória; pandas 2.2+ usa strings baseadas em Arrow.
- Leitores pulam grupos de linhas usando estatísticas quando os filtros correspondem.
- Pastas de partição (
chave=valor/) emulam o particionamento de warehouse em arquivos.
Comparação de Formatos
| Formato | Força | Fraqueza |
|---|---|---|
| CSV | Legível por humanos | Sem esquema, volumoso, lento |
| Linhas JSON | Eventos semi-estruturados | Verboso, análise lenta |
| Parquet | Padrão de análise | Não legível por humanos |
| Arrow IPC | IPC local rápido | Não é arquivo de longo prazo |
Notas de Python
import polars as pl
# Polars scan com pushdown de projeção
lf = pl.scan_parquet("lake/orders/**/*.parquet").select("order_id", "revenue")Armadilhas
- Escrever index=True - coluna
indexsurpresa no Parquet. Correção:index=Falsesempre em pipelines. - Problema de arquivos pequenos - milhares de arquivos de 1 MB tornam a listagem lenta. Correção: almejar 128-512 MB por arquivo; compactar partições.
- Derivação de esquema entre dias -
mergeSchemaoculta alterações que quebram. Correção: registro de esquema explícito e validação. - Timestamps sem fuso horário no Parquet - replays ambíguos. Correção: armazenar UTC com dtype
datetime64[ns, UTC]. - CSV como formato mart - custo de re-análise a cada leitura. Correção: mart em Parquet; CSV apenas para exportação humana.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Delta/Iceberg/Hudi | Upserts ACID no lake | Partições simples de sobrescrita diária |
| Avro | Evolução de esquema Kafka | Poda de colunas de análise |
| ORC | Clusters Hive legados | Lake Python Greenfield |
| Arquivo SQLite DuckDB | Análise local embarcada | Armazenamento de objetos multi-escritor |
FAQs
snappy ou zstd?
- zstd melhor taxa de compressão; CPU ligeiramente maior.
- zstd padrão para arquivos; snappy para escritas de latência ultra-baixa.
Qual o tamanho ideal dos arquivos Parquet?
- Almejar 128-512 MB de equivalente descomprimido por arquivo.
- Jobs de compactação mesclam fragmentos diários pequenos mensalmente.
Coluna de partição nos dados também?
- Redundante se apenas no caminho - economiza espaço.
- Incluir se os consumidores consultarem sem poda de partição.
Como ler com DuckDB?
import duckdb
duckdb.sql("SELECT region, SUM(revenue) FROM read_parquet('lake/orders/**') GROUP BY 1")Arrow vs Parquet?
- Arrow: intercâmbio em memória.
- Parquet: formato de persistência em disco.
Como criptografar em repouso?
- SSE em políticas de bucket S3/GCS.
- Criptografia do lado do cliente é rara, a menos que a conformidade exija.
Dados aninhados?
- Parquet suporta structs/listas para eventos semelhantes a JSON.
- Achatar para marts amigáveis para BI quando possível.
Como comparar esquemas?
pyarrow.parquet.read_schemaem dois caminhos e comparar.- Automatizar em CI em novas partições.
pandas vs pyarrow write?
to_parquetdo pandas usa pyarrow/fastparquet internamente.pq.write_tablequando você já tem uma Tabela Arrow.
Intercâmbio Polars e pandas?
- Ponte Arrow:
pl.from_pandas/to_pandaszero-copy quando dtypes se alinham.
Relacionado
- Performance e Memória - poda de colunas
- PySpark - escritas Parquet distribuídas
- Noções Básicas de Engenharia de Dados - sobrescrita de partição
- Validação e Qualidade de Dados - portões de esquema
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.