DuckDB como almacén analítico compacto: Adiós a ETL y Postgres
DuckDB te permite crear un almacén analítico en un solo archivo .duckdb, eliminando los procesos ETL y Postgres para cargas OLAP. El motor procesa directamente archivos Parquet, CSV y JSON desde disco local o S3/GCS, ofreciendo acceso rápido a datos para paneles y reportes sin infraestructura distribuida. Es ideal para equipos con recursos limitados que priorizan la frescura y reproducibilidad de los datos.
Problemas del stack tradicional ETL + Postgres
Postgres maneja bien las cargas OLTP, pero las consultas OLAP generan problemas en cascada: los índices ralentizan el vacuuming, los agregados compiten con transacciones y los trabajos ETL se enredan con cambios de esquema. Los equipos terminan gastando más tiempo en tareas administrativas que en análisis. DuckDB elimina estos puntos de fallo como motor OLAP embebido sin almacenamiento persistente.
La arquitectura se simplifica a:
- Fuentes (bases de datos, S3, CSV) → Instantáneas Parquet → DuckDB (capas bronze/silver/gold) → Exportaciones BI.
El pipeline se reduce a un script programado con vistas y exportaciones, minimizando la sobrecarga operativa.
SLAs para un micro-almacén DuckDB
Puedes ofrecer SLAs claros sin complejidad de clústeres:
- Frescura de datos: Actualizaciones cada 15-60 minutos con registro de timestamps.
- Precisión: Métricas en vistas SQL con control de versiones y revisión de código.
- Rendimiento: p95 < 2s para paneles con 90 días de datos.
- Recuperación: Reconstrucción completa desde Parquet en <30 minutos.
- Operaciones/Costo: Un archivo + un trabajo, sin costos de almacenamiento continuo.
El archivo .duckdb es fácil de respaldar y mover.
Caso de uso en analítica de producto
Para SaaS B2B con eventos en una base relacional y logs en S3:
- Instantáneas diarias de tablas a Parquet particionado.
- Eventos como archivos Parquet particionados por fecha.
- Vistas de métricas en capa gold (WAUs, cohortes de retención).
- Exportación de Parquet curado para herramientas BI.
La extensión httpfs permite lecturas directas desde S3 sin copias locales. DuckDB agrega múltiples archivos Parquet como una sola tabla.
Scripts de implementación práctica
Script de actualización (Python)
import duckdb
from datetime import datetime
DB = "micro_warehouse.duckdb"
con = duckdb.connect(DB)
con.execute("INSTALL httpfs;")
con.execute("LOAD httpfs;")
con.execute("""
CREATE OR REPLACE VIEW bronze_events AS
SELECT *
FROM read_parquet('data/events/date=*/events-*.parquet');
""")
con.execute("""
CREATE OR REPLACE VIEW silver_events AS
SELECT
CAST(event_time AS TIMESTAMP) AS event_time,
user_id,
team_id,
event_name,
NULLIF(properties, '') AS properties
FROM bronze_events
WHERE user_id IS NOT NULL;
""")
con.execute("""
CREATE OR REPLACE VIEW gold_weekly_active_teams AS
SELECT
date_trunc('week', event_time) AS week,
COUNT(DISTINCT team_id) AS weekly_active_teams
FROM silver_events
GROUP BY 1
ORDER BY 1;
""")
con.execute("""
COPY (SELECT * FROM gold_weekly_active_teams)
TO 'exports/gold_weekly_active_teams.parquet' (FORMAT PARQUET);
""")
con.execute("CREATE OR REPLACE TABLE ops_refresh_log AS SELECT 1 AS dummy;")
con.execute("""
INSERT INTO ops_refresh_log
SELECT 1
""")
print("Update OK:", datetime.utcnow().isoformat(), "DB:", DB)
Este script construye las capas bronze/silver/gold y exporta métricas.
Actualizaciones incrementales
Para upserts, usa MERGE sobre claves (semana, team_id) en una tabla materializada, recalculando ventanas deslizantes.
Migración sin tiempo de inactividad
Mantén OLTP en Postgres y migra OLAP a DuckDB mediante la extensión postgres_scanner para acceso de lectura/escritura a una instancia activa. Desplaza consultas gradualmente sin refactorizaciones.
Limitaciones de DuckDB como almacén
Ideal para:
- Pocos analistas (paneles, exportaciones).
- Datos solo de apéndice o instantáneas.
- Flujos portables con Parquet.
No apto para:
- Alta concurrencia con usuarios interactivos.
- Escrituras OLTP con garantías ACID.
- Seguridad a nivel de fila multiinquilino.
- Contratos de datos empresariales con muchos productores.
Lecciones clave
- DuckDB es un motor OLAP embebido en un solo archivo, que lee Parquet/S3 directamente.
- Simplifica tu stack: script + vistas en lugar de ETL + Postgres.
- SLAs alcanzables: frescura de 15 min, p95<2s, recuperación <30 min.
- Migración gradual vía postgres_scanner.
- Limitaciones: baja concurrencia, no para OLTP.
— Editorial Team
Aún no hay comentarios.