Saltar a contenido

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

  1. Ejecuta cuadernos/00_entorno.ipynb y anota la versión exacta de DuckDB, Polars y el intérprete de Python.
  2. Sin mirar la tabla de arriba: enumera tres cambios que romperían un cuaderno escrito para la 1.5.
  3. 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.