01 · DuckDB 2.0 en 10 minutos¶
Cuaderno asociado
cuadernos/00_entorno.ipynb — comprueba el entorno y genera el dataset.
Volver al 00 - Índice de la demo.
Qué es la 2.0, en una frase¶
La 2.0.0 «Cinnamon Teal» es la mayor actualización funcional de DuckDB hasta la fecha (~20 000 commits desde la 1.5), es LTS con soporte hasta al menos octubre de 2027, y su cambio conceptual es que DuckDB deja de ser exclusivamente una base de datos in-process: ahora puede servir datos y cómputo a otro proceso por HTTP.
flowchart LR
subgraph v1["Modelo 1.x — in-process"]
direction TB
A1["App Python"] --> A2["DuckDB<br/>(misma memoria)"]
A2 --> A3[("Parquet / CSV")]
end
subgraph v2["Modelo 2.0 — también cliente-servidor"]
direction TB
B1["App Python<br/>(cliente)"] -->|"Quack / HTTP"| B2["Servidor DuckDB<br/>junto a los datos"]
B2 --> B3[("Parquet / S3 /<br/>MySQL")]
end
v1 -.->|"2.0 añade"| v2
El modelo in-process NO desaparece
Sigues pudiendo import duckdb y consultar un Parquet sin levantar ningún servidor. La 2.0 amplía el alcance; no sustituye la filosofía. Y el protocolo Quack sigue en beta: no es momento de reemplazar PostgreSQL con esto.
Las cinco novedades principales mostradas en el taller¶
mindmap
root(("DuckDB 2.0"))
Servidor
quack_serve
ATTACH + TOKEN
CONNECT / DISCONNECT
quack_query
Semiestructurado
VARIANT tipado
Shredding en Parquet
variant_extract
Dialecto SQL
NEAREST joins
DML dentro de CTE
Lambdas nuevas
CTE recursivas con USING KEY
Rendimiento
E/S asíncrona
Nuevo formato de almacenamiento
Spilling y agregaciones parciales
Ecosistema
Polars y Arrow
MySQL / PostgreSQL
Agent Mode
1. Modo servidor: Quack + CONNECT¶
El protocolo nativo Quack (HTTP, puerto 9494) permite que una instancia sirva sus bases de datos. La sentencia nueva CONNECT redirige toda la sesión a un motor remoto; DISCONNECT la devuelve al local. CONNECT no es solo para Quack: también funciona con PostgreSQL y MySQL, con un optimizador de pushdown remoto que envía el SQL al servidor en vez de descargar tablas enteras.
→ Módulo 07 - Quack cliente-servidor y 06 - MySQL y MariaDB.
2. VARIANT datos semiestructurados de primera clase¶
Un tipo binario auto-descriptivo, «JSON con esteroides»: detecta la estructura común entre filas y la guarda en columnas tipadas (shredding). Compresión y velocidad muy superiores a JSON-texto, sin declarar esquema.
→ Módulo 08 - VARIANT.
3. E/S asíncrona¶
La capa de E/S se desacopla de la de procesamiento: lecturas en segundo plano y varias peticiones simultáneas. En Parquet, CSV sin comprimir y el formato nativo. En pruebas sobre Overture Maps desde S3, la lectura resultó ~3× más rápida que en la 1.5.
→ Lo verás en 05 - Parquet y Hive partitioning.
4. Nuevo dialecto SQL¶
NEAREST joins para top-k por similitud (embeddings), DML dentro de CTE, variables de sesión, CTE recursivas con USING KEY (hasta 40× en un grafo recursivo de prueba) y la nueva sintaxis lambda.
→ Módulo 02 - SQL DuckDB.
5. Motor y ecosistema¶
Formato de almacenamiento v2.0 con metadatos perezosos, compresión DICT_FSST, borrados compactos; spilling a disco en agregaciones grandes; pruning de particiones en lakehouse; y en Python, con.append() para inserciones masivas por lotes.
⚠️ Lo que puede explotar el día de la actualización¶
| Cambio | Qué hacer |
|---|---|
| Python ≥ 3.11 | Sube el intérprete antes de nada |
.pl() y .fetch_arrow_table() fuera de execute() |
Usa una relation: con.sql(q).pl(), .to_arrow_table() |
fetchone() / fetchmany() eliminados de las relations |
Mantenlos sobre con.execute(q) |
Sintaxis lambda x -> ... desactivada |
Pasa a lambda x, i: ... |
| Formato de almacenamiento nuevo | Las versiones < 2.0 no leen ficheros creados por la 2.0 (al revés sí) |
| ICU fuera del núcleo | Carga la extensión icu si usabas collations |
Detalle completo en 10 - Anexo migración.
🧠 Modelo mental correcto¶
DuckDB sigue siendo el motor que corre dentro de tu proceso. Lo nuevo es que ese proceso ya no está solo: puede pedir prestado el cómputo de otra instancia que vive junto a los datos.
Ejercicios¶
- Ejecuta
cuadernos/00_entorno.ipynby anota la versión exacta de DuckDB, Polars y el intérprete de Python. - Sin mirar la tabla de arriba: enumera tres cambios que romperían un cuaderno escrito para la 1.5.
- Explica con tus palabras por qué mover el cómputo al lado de los datos es mejor que mover los datos al lado del cómputo. ¿En qué caso no lo sería?
Soluciones en cuadernos/99_soluciones.ipynb.