Formatos de Archivo
Los formatos columnares (Parquet, Arrow) dominan los pipelines de análisis: comprimen bien, incrustan el esquema y permiten a los lectores cargar solo las columnas necesarias.
Busca en todas las páginas de la documentación
Los formatos columnares (Parquet, Arrow) dominan los pipelines de análisis: comprimen bien, incrustan el esquema y permiten a los lectores cargar solo las columnas necesarias.
Tarjeta de referencia rápida - lista para copiar y pegar.
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",
)
# Leer de nuevo columnas seleccionadas
subset = pd.read_parquet("lake/orders", columns=["order_id", "revenue"], filters=[("dt", ">=", "2025-01-01")]Cuándo usar esto:
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 -> Tabla Arrow (copia cero cuando es posible)
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,
)
# Leer metadatos sin cargar datos
meta = pq.read_metadata(out_dir / "data.parquet")
print("filas:", meta.num_rows, "columnas:", meta.num_columns)
# Lectura con poda de columnas
loaded = pq.read_table(out_dir / "data.parquet", columns=["order_id", "revenue"])
print(loaded.to_pandas())Lo que esto demuestra:
dt=YYYY-MM-DDclave=valor/) emulan el particionamiento de almacén en archivos.| Formato | Fortaleza | Debilidad |
|---|---|---|
| CSV | Legible por humanos | Sin esquema, voluminoso, lento |
| Líneas JSON | Eventos semiestructurados | Verboso, análisis lento |
| Parquet | Estándar de análisis | No legible por humanos |
| Arrow IPC | IPC local rápido | No archivo a largo plazo |
import polars as pl
# Escaneo de Polars con empuje de proyección
lf = pl.scan_parquet("lake/orders/**/*.parquet").select("order_id", "revenue")index sorpresa en Parquet. Solución: index=False siempre en pipelines.mergeSchema oculta cambios disruptivos. Solución: registro y validación de esquema explícitos.datetime64[ns, UTC].| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Delta/Iceberg/Hudi | Upserts ACID en el lago | Particiones simples de sobrescritura diaria |
| Avro | Evolución del esquema de Kafka | Poda de columnas de análisis |
| ORC | Clústeres heredados de Hive | Lago de Python nuevo |
| Archivo SQLite DuckDB | Análisis local incrustado | Almacenamiento de objetos multi-escritor |
import duckdb
duckdb.sql("SELECT region, SUM(revenue) FROM read_parquet('lake/orders/**') GROUP BY 1")pyarrow.parquet.read_schema en dos rutas y comparar.to_parquet de pandas usa pyarrow/fastparquet internamente.pq.write_table cuando ya tienes una Tabla Arrow.pl.from_pandas / to_pandas copia cero cuando los dtypes coinciden.Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 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+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026