DuckDB简介与、生态、实战:MotherDuck、Duckle、SQLFlow、DuckQuery

概述

官网中文官网,使用C++编写、开源(GitHub,39.9K Star,3.5K Fork)可在任何地方运行的进程内SQL数据库,即嵌入式分析型数据库。官方中文文档

将数据写入本地文件主要依赖COPY ... TO命令,支持多种格式,可通过FORMAT关键字指定,也可从文件扩展名自动推断。

格式(FORMAT) 文件扩展名示例 常用选项示例 说明
CSV .csv (HEADER, DELIMITER ',', QUOTE '"') 最通用的表格格式,选项丰富
Parquet .parquet (FORMAT PARQUET, COMPRESSION ZSTD) 列式存储,适合大数据集,压缩率高
JSON .json (FORMAT JSON, ARRAY TRUE) 导出为JSON数组或NDJSON

客户端

支持:CLI、Python、Go、Java、Node.js、C/C++、R、Rust、ODBC等

可从官网下载,也可使用命令行安装。

基于命令行安装:

bash 复制代码
winget install DuckDB.cli
brew install duckdb

对于Linux系统,可直接下载二进制文件:

bash 复制代码
wget https://github.com/duckdb/duckdb/releases/download/v1.5.0/duckdb_cli-linux-amd64.zip
unzip duckdb_cli-linux-amd64.zip
/duckdb

以Windows系统为例,从官网下载duckdb_cli-windows-amd64.zip,解压缩得到duckdb.exe,打开终端:

bash 复制代码
SELECT * FROM generate_series(5);
create table t1(id integer, name varchar);
insert into t1 values (1, 'a'),(2, 'b');
select * from t1;
copy t1 TO 'output.csv' (HEADER, DELIMITER ',');

部分操作截图

查看本地CSV文件:

Java引入依赖:implementation("org.duckdb:duckdb_jdbc:1.4.4.0")

Python生态基于pip安装:pip install duckdb==1.4.4

Python SDK示例:

py 复制代码
import duckdb
conn = duckdb.connect()
print(conn.execute('SELECT 42').fetchall())

基于源码安装:

bash 复制代码
bash 复制代码
bash 复制代码

CSV

开箱支持CSV:能直接查询CSV文件,还能够快速将CSV导入数据库表,或将查询结果导出为CSV文件。自动解析文件内容并推断字段类型;也可显式指定字段类型等参数。

databases.csv内容如下:

复制代码
name, type, version
sqlite, oltp, 3.53.3
duckdb, olap, 1.5.4

查询语句:

sql 复制代码
SELECT * FROM read_csv('databases.csv');
SELECT * FROM read_csv(
	'databases.csv',
	delim = ',',
	header = true,
	columns = {
	'name': 'VARCHAR',
	'type': 'VARCHAR',
	'version': 'VARCHAR'
	}
);
-- 能根据文件扩展名自动识别CSV文件
SELECT * FROM 'databases.csv';
-- 使用FROM优先的查询语法
FROM 'databases.csv' SELECT *;
-- 使用通配符批量读取多个文件,并自动合并
SELECT * FROM read_csv('data/*.csv');

建表语句:

sql 复制代码
CREATE TABLE db AS SELECT * FROM read_csv('databases.csv');
CREATE TABLE db AS FROM 'databases.csv';
DELETE FROM db;
INSERT INTO db SELECT * FROM read_csv('databases.csv');
-- 大批量数据导入
COPY db FROM 'databases.csv';

自动基于CSV文件推断字段类型并创建表,然后导入全部数据,整个过程一步完成。

数据导出到CSV文件:

sql 复制代码
COPY db TO 'output.csv' (HEADER, DELIMITER ',');
-- 导出查询结果
COPY (SELECT name, version FROM db) TO 'output.csv' (HEADER, DELIMITER ',');

插件

官方提供MySQL插件,可把MySQL服务器当成一个可挂载的外部数据库,连接之后可像访问本地DuckDB数据表一样访问MySQL中的数据,支持写回MySQL。

场景

  • 实时数据分析:传统架构需要将业务系统数据库(例如MySQL)通过 ETL 同步到数据仓库中进行数据分析,DuckDB 则可以通过插件直接读取 MySQL 数据进行实时分析
  • 轻量级 ETL 数据管道:许多企业需要将数据库同步到数据湖中,DuckDB 通过一个命令就可以完成从 MySQL 到 Parquet 数据湖转换
  • 数据库迁移:DuckDB 可以作为中间组件实现 MySQL 到 MySQL 的数据迁移,以及 MySQL 到 PostgreSQL 等的数据迁移
  • 轻量级数据平台:很多中小公司没有数仓团队,无法支持 ClickHouse 这种大型平台;使用 MySQL + DuckDB + Metabase 这种轻量级报表分析系统维护成本极低

安装插件:INSTALL mysql,首次使用时系统会自动加载插件,也可手动加载:LOAD mysql;

加载外部数据库连接:ATTACH 'host=localhost port=3306 database=dbname user=root password=xxxxxx' AS mysqldb (TYPE mysql);

上述语句暴露密码,官方推荐使用密钥(Secret)管理器:

sql 复制代码
-- 创建密钥
CREATE SECRET (
	TYPE mysql,
	HOST '127.0.0.1',
	PORT 3306,
	DATABASE dbname,
	USER 'root',
	PASSWORD 'XXXXXX'
);
-- 挂载数据库
ATTACH '' AS mysqldb (TYPE mysql);

MySQL实例连接成功,即可像DuckDB数据表一样查询:

sql 复制代码
SELECT customer_id, first_name FROM mysqldb.sakila.customer LIMIT 1;

将MySQL数据复制到DuckDB表中

sql 复制代码
CREATE TABLE local_customer AS FROM mysqldb.sakila.customer;

也可将数据写入MySQL数据库:

sql 复制代码
-- 远程创建MYSQL数据表
CREATE TABLE mysqldb.t1(id INTEGER, name VARCHAR);
-- 写入数据
INSERT INTO mysqldb.t1 VALUES (42, 'DuckDB');

如果担心误操作可能对MySQL数据库的影响,可在ATTACH命令中使用只读参数

sql 复制代码
ATTACH '' AS mysqldb (TYPE mysql, READ_ONLY);

可进一步将DuckDB作为轻量级ETL引擎,实现数据管道功能

sql 复制代码
-- MySQL数据导出Parquet文件
COPY mysqldb.orders TO 'orders.parquet';
-- Parquet文件导入MySQL
COPY mysqldb.orders FROM 'orders.parquet';

提供函数:

  • mysql_query:用于执行一个查询语句并返回结果
  • mysql_execute:用于执行任意MySQL命令,包括DDL以及DML
sql 复制代码
SELECT * FROM mysql_query(
	'mysqldb',
	'SELECT version();'
);
-- 创建远程 MySQL 数据表
CALL mysql_execute('mysqldb', 'CREATE TABLE my_table (i INTEGER)');
sql 复制代码
sql 复制代码
sql 复制代码
sql 复制代码

Quack

官方文档

DuckDB 一直采用类似 SQLite 的嵌入式架构路线,没有独立服务进程,没有数据库端口,没有网络协议,也没有连接池。

大量用户都在尝试为 DuckDB 增加客户端-服务器能力,包括自建 RPC、Arrow Flight SQL、MotherDuck、pg_duckdb 等。

官方实现Quack远程协议,插件形式,可让两个DuckDB实例之间通过网络进行远程连接和访问。

技术特点:

  • 基于HTTP协议:没有重复定义新的传输协议,而是复用HTTP或HTTPS(基于反向代理),完全兼容已有的负载均衡、防火墙等技术
  • 单次网络往返传输:每次查询都只需要一次网络 Round Trip,大型结果集采用多次 FETCH 命令返回,支持多线程并行优化;适合分析查询和批量计算场景
  • 内部序列化机制:没有采用传统的序列化(如JSON),而是采用类似WAL的内部序列化编码,可以避免传输过程中的格式转换和精度丢失
  • 客户端驱动的交互方式:所有请求都由客户端发起,服务器负责响应,但从不主动推送消息和数据
  • 两种访问模式:客户端既可通过quack_query执行无状态查询(类似RPC),也可通过ATTACH加载远程数据库
  • DuckDB-Wasm集成:DuckDB-Wasm完全支持Quack协议,可通过浏览器访问远程数据库进行数据分析

在第一个DuckDB实例中启动服务端:

sql 复制代码
CALL quack_serve(
	'quack:localhost',
	token = 'some_token'
);
CREATE TABLE hello AS FROM VALUES ('world') v(s);

quack_serve函数用于启动服务,默认监听本地9494端口;后建表hello

在第二个DuckDB实例中以客户端角色进行连接:

sql 复制代码
CREATE SECRET(
	TYPE quack,
	TOKEN 'some_token'
);
ATTACH 'quack:localhost' AS remote;
FROM remote.hello;

通过ATTACH命令访问远程服务器中的数据表。

可视化

很多,如DataGrip

MotherDuck

官网,将DuckDB商业化的公司,

部分开源项目:

对比SnowFlake

Duckle

官网,使用Rust编写、开源(GitHub,893 Star,70 Fork)跨平台本地优先的桌面数据集成平台,底层基于 DuckDB 执行计算,兼具 ETL 工具、可视化数据管道编排器和 AI 助手等功能。

功能特性

  • 可视化ETL/ELT:用户在可视化的画布上通过拖拽节点设计数据处理管道,Duckle会自动将整个管道编译成SQL,然后交由DuckDB执行。用户还能查看生成的SQL,支持实时预览数据结果
  • 丰富的连接器:支持大量(160+)的数据连接器,类型包括数据库(PostgreSQL、MySQL、SQL Server、Oracle、SQLite等)、数据仓库(Snowflake、BigQuery、Redshift等)、NoSQL(MongoDB、Cassandra、Elasticsearch、Redis等)、向量存储(pgvector、Qdrant、Milvus等)、文件格式(CSV、Parquet、Excel、JSON等)、湖仓数据(Iceberg、Delta Lake、DuckLake等)、云存储(AWS S3、Azure Blob、Google Cloud Storage等)、SaaS系统(Salesforce、HubSpot、GitHub、Jira、Stripe等)以及REST API、GraphQL、OData、Kafka等系统
  • 数据转换:目前已提供超过130个转换组件,涵盖字段映射、数据清洗、多表关联、窗口计算、聚合分析、CDC增量同步、SCD维度建模以及AI数据准备等典型场景
  • 数据质量控制:内置28个数据质量组件和专门的Validator节点,对数据类型、格式规则、完整性、一致性及业务约束进行校验,并且将不符合要求的数据自动路由到异常数据通道,而非直接写入目标系统
  • 列级血缘分析:提供企业级的列级血缘分析能力,能够自动追踪数据管道中每个输出字段的来源及其转换过程
  • 流程控制:提供19个控制流节点,用于管理数据管道的执行逻辑和任务编排能力,使数据处理流程不仅能够完成数据转换,还能够实现条件判断、分支处理、错误控制和流程调度等复杂业务场景
  • 代码执行:提供7个代码执行节点(SQL、Shell、JavaScript、WebAssembly等),用于处理可视化组件难以覆盖的复杂业务逻辑和个性化数据处理需求
  • DuckDB引擎:使用DuckDB作为统一执行引擎,所有可视化数据管道都会自动编译为SQL,由DuckDB的向量化列式计算引擎执行,从而兼具高性能和易用性
  • 任务调度:拥有完善的任务调度与自动化运行机制,支持基于Cron表达式、固定时间间隔(Interval)以及文件监控(File Watch)等多种触发方式自动执行数据管道,满足定时同步、增量采集、周期性数据加工和实时文件处理等场景需求
  • AI助手:官方AI助手(Duckie)基于Qwen 2.5 Coder,支持使用自然语言描述需求并生成管道。模型默认运行在本地,下载一次后即可离线运行,不需要API Key
  • MCP支持:提供内置MCP Server,可以将数据管道、数据源连接和数据处理能力以标准协议方式开放给Claude等大语言模型和AI Agent调用

从官网下载二进制安装包,第一次运行时会自动安装所需的 DuckDB 引擎和其他组件:

配置完成之后可以通过系统自带示例了解 Duckle 的使用:

SQLFlow

Python语言开发、基于DuckDB开源(GitHub,780 Star,25 Fork)高性能流处理引擎,完全采用SQL构建实时数据管道,在单机环境下即可提供极高的吞吐能力。可看作轻量版的 Apache Flink。官方文档

功能特性

  • 数据源:支持多种流式数据源,包括 Kafka、Websocket
  • 执行引擎:DuckDB负责高效的列式执行,Apache Arrow提供零拷贝的高性能内存格式,在数百MB内存情况下即可处理每秒数万条事件
  • 输出结果:数据处理结果可写入Kafka、PG、Clickhouse、文件系统、S3对象存储等,支持parquet、csv、JSON、IceBerg等文件格式
  • 易于使用:完全基于SQL语句和配置文件构建数据流管道,描述数据输入、转换处理、结果输出的全过程,极大降低流计算的学习成本
  • 错误处理:提供灵活的错误处理策略(RAISE、IGNORE、DLQ),可满足不同环境下的可靠性需求
  • 可观测性:后台进程提供丰富的日志和指标信息,方便通过Prometheus等工具进行监控

官方Benchmark

场景 吞吐量,消息数/秒 最大RSS内存,MB 内存使用峰值,MB
基于内存的简单聚合 45,000 230 130
基于磁盘的简单聚合 36,000 256 102
补充额外信息 13,000 368 124
基于磁盘的CSV连接 11,500 312 152
基于内存的CSV连接 33,200 300 107
基于内存的滚动窗口 44,000 198 96

实战

bash 复制代码
make setup-dev
# 简单验证
docker run -v $(pwd)/dev:/tmp/conf -v /tmp/sqlflow:/tmp/sqlflow turbolytics/sql-flow:latest dev invoke /tmp/conf/config/examples/basic.agg.mem.yml /tmp/conf/fixtures/simple.json
# 启动单节点Kafka服务
docker-compose -f dev/kafka-single.yml up -d
# 将测试消息发布到Kafka
python3 cmd/publish-test-data.py --num-messages=10000 --topic="input-simple-agg-mem"
# 启动Kafka Console消费者
docker exec -it kafka1 kafka-console-consumer --bootstrap-server=kafka1:9092 --topic=output-simple-agg-mem
# 启动SQLFlow
docker run -v $(pwd)/dev:/tmp/conf -v /tmp/sqlflow:/tmp/sqlflow -e SQLFLOW_KAFKA_BROKERS=host.docker.internal:29092 turbolytics/sql-flow:latest run /tmp/conf/config/examples/basic.agg.mem.yml --max-msgs-to-process=10000

DuckQuery

开源、基于DuckDB引擎开源(GitHub,23 Star)AI可视化SQL工作台,提供本地文件与远程数据库库一站式跨源分析。

在线体验,不支持连接远程数据库、读取Excel文件以及AI助手功能,这些功能需要安装本地版本。

功能特性

  • 本地文件导入:直接拖拽CSV、Excel、Parquet、JSON到浏览器,转化为DuckDB原生表,不需要上传服务器,查询速度极快
  • 外部数据库:支持连接MySQL、 PG外部数据库,基于DuckDB的统一查询引擎实现跨数据源(包括文件和数据库)分析
  • 查询工作台:SQL编辑器提供代码补全、语法高亮、格式化等辅助功能,同时还提供可视化的JOIN查询、集合运算以及透视表配置,方便快速数据分析
  • 可视化图表:可以基于查询结果一键转换为柱状图、折线图、面积图、饼图、环形图、大数字等可视化结果
  • 数据导出:查询结果可导出为CSV、JSON、Excel格式文件
  • AI助手:配置模型之后,可以提供问数对话、报错医生、AI图表推荐等功能
  • 本地优先:支持自托管,通过本地引擎(如DuckDB-Wasm)直接执行查询,数据不上传、计算不依赖云端服务,让用户对数据拥有完全控制权

安装:

  • GitHub Release
  • Docker、Docker Compose
  • 源码
bash 复制代码
git clone https://github.com/Chenkeliang/duckdb-query.git
cd duckdb-query && ./quick-start.sh

浏览器打开http://localhost:48000开始体验

相关推荐
不剪发的Tony老师12 天前
DuckDB直接连接MySQL,以后还需要ETL吗?
mysql·数据分析·etl·duckdb
不剪发的Tony老师17 天前
DuckDB数据分析实战:CSV文件导入导出
数据分析·csv·duckdb
l1t1 个月前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
l1t2 个月前
DuckDB对group by cube / rollup / groupping sets查询的优化
数据库·duckdb
l1t2 个月前
DeepSeek总结的DuckDB-Iceberg 在 v1.5.3 中的新特性
数据库·duckdb
DarkAthena2 个月前
【DuckDB】一条 SQL 同时连接 Oracle 和 GaussDB
oracle·gaussdb·duckdb
l1t2 个月前
DeepSeek总结的在 DuckDB 中试驾 Lance 数据湖仓格式
数据库·人工智能·机器学习·duckdb
l1t2 个月前
DeepSeek总结的 DuckDB 1.5.3:并非普通的补丁版本
数据库·duckdb
l1t3 个月前
DeepSeek总结的Quack:DuckDB 客户端-服务器协议(二)
运维·服务器·duckdb