Volver al inicio

DuckDB como almacenamiento: reemplazando ETL Postgres

DuckDB implementa almacenamiento analítico compacto en un archivo, reemplazando ETL + Postgres para tareas OLAP. Describe arquitectura, scripts de actualización, SLA y limitaciones. Adecuado para desarrolladores para analítica de producto con datos Parquet.

DuckDB: micro-almacenamiento en lugar de caos ETL
Advertisement 728x90

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:

Google AdInline article slot
  • 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.

Google AdInline article slot

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.

Google AdInline article slot

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

Advertisement 728x90

Leer después