- DuckDB es un motor SQL de código abierto que permite procesar datos tabulares a gran escala en una sola máquina de forma rápida y sencilla, y recientemente se ha usado ampliamente en ingeniería de datos
- Es fácil de instalar, no tiene dependencias y puede ejecutarse de inmediato en un entorno Python, por lo que es ideal para CI y automatización de pruebas
- Gracias a la optimización de consultas analíticas, puede ofrecer un rendimiento hasta 1,000 veces superior al de SQLite o Postgres, y permite consultar directamente varios formatos de archivo (
csv, parquet, json)
- Con una sintaxis SQL amigable (
EXCLUDE, COLUMNS, QUALIFY, encadenamiento de funciones, etc.) y una API de Python, es posible desarrollar pipelines complejos de manera eficiente
- Con cumplimiento ACID, UDF de alto rendimiento y extensiones de integración con PostgreSQL, está surgiendo como una alternativa de lakehouse para datos de escala intermedia
Resumen de DuckDB
- DuckDB es un motor SQL en proceso enfocado en la optimización de consultas analíticas
- Se ejecuta dentro de la aplicación sin requerir un servidor separado, y no necesita servicios externos como Postgres
- Está especializado en operaciones masivas de joins y agregaciones, y ofrece un rendimiento de hasta 100 a 1,000 veces mayor que los motores centrados en transacciones (OLTP)
- Uno de sus principales casos de uso es el procesamiento por lotes (batch processing) leyendo directamente desde disco archivos grandes como
csv, parquet y json
- También puede usarse para exploración ligera de datos, por ejemplo consultando un archivo CSV directamente desde la línea de comandos
Características principales
-
Velocidad
- DuckDB es uno de los motores de procesamiento de datos de código abierto más rápidos, y se mantiene entre los mejores en benchmarks
- Frente a Polars, DataFusion, Spark y Dask, DuckDB suele dominar con datos pequeños, mientras que Spark y Dask siguen siendo competitivos con grandes volúmenes
-
Instalación simple y sin dependencias
- DuckDB se distribuye como un único binario precompilado, y en Python puede instalarse al instante con
pip install duckdb
- Al no tener dependencias, su instalación es mucho más simple que la de frameworks grandes como Spark
- Combinado con
uv, permite preparar un entorno Python en menos de 1 segundo
-
CI y pruebas
- Gracias a su arranque rápido y ligereza, es muy adecuado para entornos de CI y pruebas de pipelines de datos
- Antes, las pruebas basadas en Spark eran lentas y complejas, pero con DuckDB es más fácil simplificar la configuración del entorno y mantener consistencia con producción
-
Experiencia al escribir SQL
- DuckDB permite escribir SQL y validar sintaxis rápidamente
- Resulta más conveniente que el modo local de Spark o AWS Athena para ejecución inmediata y desarrollo iterativo
- También ofrece una UI con autocompletado
-
Sintaxis SQL amigable
- DuckDB incluye muchas extensiones SQL fáciles de usar
- Soporta
EXCLUDE, COLUMNS, QUALIFY, modificadores de agregación para funciones de ventana y encadenamiento de funciones (first_name.lower().trim())
- Estas funciones permiten realizar selección y transformación compleja de columnas de forma concisa
-
Soporte para múltiples formatos de archivo
- Permite consultar datos directamente desde S3, URLs web y archivos locales
- Ofrece opciones estrictas para tipos en CSV para evitar errores causados por datos de entrada no estructurados
-
API de Python
- En Python, se pueden definir pipelines basados en CTE paso a paso y revisar fácilmente los datos en cada etapa
- Se pueden encadenar consultas SQL con llamadas a
duckdb.sql()
- Gracias a la ejecución diferida (lazy execution), se pueden inspeccionar resultados intermedios sin pérdida de rendimiento
- También es posible probar funciones por etapa, lo que mejora la eficiencia de las pruebas en CI
-
Cumplimiento ACID
- DuckDB ofrece garantías ACID completas incluso en trabajos con grandes volúmenes de datos
- Por esta característica, puede funcionar como alternativa intermedia a formatos lakehouse como Iceberg y Delta Lake
-
UDF de alto rendimiento y extensiones de la comunidad
- Es posible crear funciones definidas por el usuario (UDF) de alto rendimiento en C++
- A través de Community Extensions, se pueden instalar extensiones al instante con comandos como
INSTALL h3 FROM community
- Por ejemplo: soporte para indexación hexagonal (h3) para datos geoespaciales
-
Documentación
- Toda la documentación se ofrece en un solo archivo Markdown, lo que facilita su uso para entrenamiento de LLM o búsquedas dentro del editor de código
- Gracias al code folding, es fácil copiar solo las partes necesarias
Uso real y resultados
- En el proyecto de código abierto Splink, adoptar DuckDB como backend predeterminado permitió
- reducir los problemas de los usuarios, acelerar el trabajo y simplificar el desarrollo y las pruebas de funciones
Extensiones destacadas
- PostgreSQL Extension: permite conectar y consultar directamente bases de datos Postgres desde DuckDB
- pg_duckdb: incrusta el motor DuckDB dentro de Postgres para combinar procesamiento transaccional y analítico
- En el futuro, tras mejorar la optimización de índices de Postgres y el filter pushup, podría lograr una adopción amplia
2 comentarios
Es irónico usar
parq, pensado para procesamiento distribuido, con el objetivo de procesarlo en una sola máquina.Comentarios en Hacker News
Hay muchas razones por las que me gusta DuckDB
Soporta archivos
.parquet,.jsony.csv, y permite lectura con glob comoselect * from 'tsa20*.csv', así que puedes tratar cientos de archivos como si fueran uno soloIncluso si el esquema es distinto, se pueden combinar fácilmente con
union_by_name, y el parser de CSV asigna los tipos automáticamente bastante bienLa versión WebAssembly pesa 2 MB y la CLI 16 MB, así que es muy pequeño
Gracias a eso se puede incluir directamente en un producto. Por ejemplo, como Malloy
Malloy es como una versión para técnicos de PowerBI o Tableau, pero usa un modelo semántico para ayudar a la IA a escribir mejores consultas. Se siente como si SQL fuera 10 veces más fácil de usar
Antes dedicaba tiempo a entender primero el esquema, pero ahora cargo los datos, escribo consultas exploratorias, valido hipótesis y repito el proceso de limpieza, transformación y creación de tablas
Eso me permite profundizar mucho más rápido y detectar antes los callejones sin salida, reduciendo el tiempo perdido
Escuché que hay un paper sobre cómo funciona el parser de CSV y sobre ideas para mejorarlo en el futuro, pero todavía no lo encuentro
En particular, la ingesta de Parquet y JSON es muy cómoda, y
clickhouse-localse parece a la idea de incrustar DuckDBCon la sintaxis
SELECT ... FROM s3Cluster(...)puedes hacer ingesta con wildcard desde un bucket de S3, y se distribuye entre los nodos del clústerParece que también soporta
schema_inference_modeClickHouse también implementó una función similar a
union_by_nameDocumentación relacionada: función s3Cluster, schema inference, PR #55892
Pero Shaper usa SQL en vez de un lenguaje aparte
Está basado en DuckDB y permite crear dashboards solo con SQL
Shaper GitHub
La velocidad es sorprendente, y la detección automática de esquema funciona correctamente la mayor parte del tiempo
Un LLM genera el SQL correcto a partir de consultas en lenguaje natural
Yo antes hacía imports manuales con SQLite, pero DuckDB hizo que todo fuera mucho más simple
Yo también soy de los que usan DuckDB todo el tiempo
Trabajo con científicos que investigan el entorno costero de BC, y manejamos enormes volúmenes de datos, desde observaciones de glaciares hasta datos de drones de aguas profundas
Adoptamos DuckDB como motor de una nueva herramienta de transformación de datos de biodiversidad, cuyo objetivo es convertir y validar datos según el estándar Darwin Core
Creamos tablas de DuckDB dinámicamente en función del esquema e importamos los datos. Si falla, indica el motivo fila por fila
La transformación y la validación también se hacen completamente dentro de DuckDB
Gracias a eso construimos una aplicación mucho más rápida, más potente y capaz de ejecutarse también en el navegador
Los investigadores de campo incluso pueden usarla sin conexión en el navegador de un iPad
DuckDB me da la confianza de que SQL se encarga del trabajo pesado
La falta de estabilidad de tipos la compensamos con parsing y pruebas
El objetivo de este proyecto es permitir que los científicos analicen datos de biodiversidad y genómica con una herramienta común y los publiquen en repositorios públicos
Yo trabajo mucho con HDF5 en procesamiento de datos científicos, pero DuckDB no lo soporta de forma nativa
La extensión existente era lenta y limitada, así que hice una extensión nueva con plantillas de C++
Estoy buscando gente interesada en colaborar
En lo personal, la sintaxis de Polars me resulta mucho más cómoda que SQL, así que no sé si vale la pena probar DuckDB
Nosotros hacemos el análisis y el procesamiento de feeds de Bluesky con DuckDB
Para obtener resultados rápido usamos la interfaz de Apache Arrow y generamos código directamente desde consultas SQL de DuckDB con SQG
Quiero mencionar el proyecto de Java manifold-sql
Permite escribir DuckDB SQL inline con type safety
Puedes poner SQL directamente dentro del código y recorrer los resultados con
.fetch(), sin capas intermedias, lo que queda muy limpioEl argumento del autor es válido para procesamiento de datos básico,
pero la parte de que “la mayoría de los datos tabulares se pueden procesar en una sola máquina” sí es discutible
Cuando empiezas a escalar, pivotear o enriquecer datos, aparece rápido el problema de memoria agotada (OOM)
Además, la afirmación de que “SQL debería ser la primera opción en la nueva ingeniería de datos” tampoco encaja tan bien para análisis complejos
Las API de dataframe como Polars o pandas también tienen muchas ventajas, pero el problema es que el ecosistema no está estandarizado y a menudo hay que reescribir pipelines
La mayoría de los datos están por debajo de 10 GB, así que una sola máquina suele ser suficiente
Muchas veces se usa Spark en exceso
Mi postura es: “pruébalo primero con DuckDB”. En casos simples es rápido y eficiente
SQL es bueno para pipelines simples, pero la legibilidad depende de cada persona
A mí me resulta mucho más fácil leer del lado de dataframe
Del lado de ingesta se usa mucho Python o Scala, pero SQL no va a desaparecer
OOM probablemente solo sea un problema en casos extremos
Así como DuckDB está ganando atención, Polars también está siendo subestimado
Yo hago bastante procesamiento de datos y uso sobre todo Polars
Es muy rápido y tiene muchas funciones que, como en pandas, son difíciles de implementar con SQL
También se pueden usar funciones de Python directamente
Aunque DuckDB tuviera el mismo rendimiento, me da la impresión de que SQL tendría limitaciones expresivas, y eso me hace dudar
Como es standalone, instalarlo también es simple, y casi no hay tuning ni curva de aprendizaje
Cargué en DuckDB un archivo de Excel con formato desastroso generado por un mainframe,
y con la opción
all_varcharse cargó en menos de un segundoExcel todavía sigue intentando abrir el archivo
DuckDB es excelente, pero la carga dinámica de extensiones choca con la firma de código y hace difícil usarlo en apps comerciales
Además, la extensión espacial usa componentes LGPL, así que hay un tema de licencias
Estaría bueno poder combinar solo las funciones necesarias a nivel de paquete, como en Apache Arrow
Ejemplo: para transferir arrays por HTTP a GB/s, Arrow Flight; para compartir archivos, Arrow IPC; para leer Parquet, agregar un trait aparte
El sistema de tipos SQL de DuckDB es distinto del de Arrow, así que puede haber problemas de incompatibilidad de tipos
Arrow ofrece librerías nativas en la mayoría de los lenguajes
Me pregunto si se puede consultar rápido una página filtrada con cláusulas WHERE
en una sola tabla con decenas de miles de millones de transacciones y 30 columnas
En Postgres incluso un simple count(*) tarda mucho
Los únicos casos en los que me fue lento fueron joins complejos o glob sobre muchos archivos
Si las condiciones WHERE son pares simples columna-valor, debería resolverlo bastante rápido
DuckDB no es solo una base de datos rápida, también tiene una experiencia de desarrollador (devx) excelente
Es fácil empezar, así que el ecosistema está creciendo rápido
La integración con Web/WASM también impresiona
Ojalá aparezcan más motores pequeños como este y continúe la competencia y la innovación