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.
Busque em todas as páginas da documentação
Formatos colunares (Parquet, Arrow) dominam pipelines de análise: comprimem bem, embutem esquema e permitem que leitores carreguem apenas as colunas necessárias.
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:
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": pd.Categorical(["East", "West", "East"]),
"revenue": [120.0, 340.0, 150.0],
"ordered_at": pd.to_datetime(["2025-01-01", "2025-01-02", "2025-01-03"], utc=True),
}
)
# pandas -> Tabela Arrow (zero-copy onde possível)
table = pa.Table.from_pandas(df, preserve_index=False)
out_dir = Path("lake/orders/dt=2025-01-15")
out_dir.mkdir(parents=True, exist_ok=True)
pq.write_table(
table,
out_dir / "data.parquet",
compression="zstd",
use_dictionary=True,
)
# Ler metadados sem carregar dados
meta = pq.read_metadata(out_dir / "data.parquet")
print("linhas:", meta.num_rows, "colunas:", meta.num_columns)
# Leitura com poda de colunas
loaded = pq.read_table(out_dir / "data.parquet", columns=["order_id", "revenue"])
print(loaded.to_pandas())O que isso demonstra:
dt=AAAA-MM-DDchave=valor/) emulam o particionamento de warehouse em arquivos.| 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 |
import polars as pl
# Polars scan com pushdown de projeção
lf = pl.scan_parquet("lake/orders/**/*.parquet").select("order_id", "revenue")index surpresa no Parquet. Correção: index=False sempre em pipelines.mergeSchema oculta alterações que quebram. Correção: registro de esquema explícito e validação.datetime64[ns, UTC].| 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 |
import duckdb
duckdb.sql("SELECT region, SUM(revenue) FROM read_parquet('lake/orders/**') GROUP BY 1")pyarrow.parquet.read_schema em dois caminhos e comparar.to_parquet do pandas usa pyarrow/fastparquet internamente.pq.write_table quando você já tem uma Tabela Arrow.pl.from_pandas / to_pandas zero-copy quando dtypes se alinham.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+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026