.parquet · .csv · .tsv · .json · .ndjson · .xlsx · .xls,可同时拖入多个文件做 JOIN
DuckDB SQL 工作台 把 Parquet / CSV / JSON / Excel 文件直接拖进浏览器,就能写 SQL 查询、JOIN、INSERT/UPDATE/DELETE,并把结果或改过的表导出 Parquet/CSV/JSON/Excel 四种格式。底层是 @duckdb/duckdb-wasm——把 DuckDB 的 C++ 引擎编译成 WebAssembly,跟 DuckDB CLI 同源同语法,整个 35 MB 引擎跑在浏览器里,文件不出本地。
DuckDB 是过去几年最火的「单机分析数据库」:列存、向量化执行、对 Parquet/CSV 的零拷贝读取、PostgreSQL 兼容语法。它的定位是「数据工程师的 SQLite」——不需要服务、不需要安装、就一个文件。把它编译成 wasm 之后,浏览器就成了一个本地 OLAP 引擎:你可以在前端做 SQL JOIN、聚合、窗口函数,速度跟本地 CLI 几乎没差。
整个工具没有任何后端。文件用 db.registerFileBuffer() 注册到 DuckDB 的内部虚拟文件系统里,引擎读你浏览器内存里的字节,没有上传。Wasm 引擎本身从同源静态资源加载(约 35 MB),加载完成后断网也能继续用。
界面三块:左侧已注册表树(表名 + 行数 + 列名/类型,点三角图标展开/折叠列定义,点表名一键写入 SELECT * LIMIT 100 并立即预览),右上 SQL 编辑器(CodeMirror 高亮、Cmd/Ctrl+Enter 运行、表名/列名自动补全、SQL 格式化),右下结果区(列名 + 类型、行号、运行时间、Parquet/CSV/JSON/Excel 多格式导出 + 复制为 TSV)。
把多个文件拖进来后每个文件都成了一张表,直接写 SQL 跨文件 JOIN:
SELECT u.name, COUNT(*) AS n
FROM events e
JOIN users u ON e.user_id = u.id
GROUP BY 1
ORDER BY 2 DESC
LIMIT 20;
跟连真实 Postgres 没什么差别——这就是为什么 DuckDB 这两年在数据分析圈子里口碑爆炸。
只想看 Parquet 文件结构和样本数据用页面底部的 Parquet 预览器 更轻量;做完 SQL 查询想再处理结果可以接 JSON ↔ CSV 转换、代码格式化(DuckDB 的 SQL 也能用 sql-formatter 美化)。两个工具配合刚好覆盖整条「看一眼 → 做分析 → 给结果」的数据工程链路。
首次加载时浏览器要下载并实例化 DuckDB-Wasm——包含 35 MB 左右的 wasm 引擎和 700 KB 的 worker 脚本,加载时间取决于网络(一般 3-10 秒)。加载完后整个 SQL 引擎就跑在浏览器里,后续所有查询都是本地执行没有任何网络请求。文件本身不上传:用 db.registerFileBuffer() 注册到 DuckDB 的虚拟文件系统里,引擎读你浏览器内存里的字节,跟传统 ODBC/HTTP 数据库连接完全不一样。
Parquet(.parquet/.pq)、CSV(.csv)、TSV(.tsv)、JSON(.json)、NDJSON / JSONL(.ndjson/.jsonl)、Excel(.xlsx/.xls)。每个文件用 CTAS 物化成 DuckDB 基础表(CREATE TABLE x AS SELECT * FROM read_parquet/read_csv_auto/read_json_auto),所以 UPDATE / INSERT / DELETE 都能直接对它们跑。表名从文件名生成(小写、非字母数字下划线 → _),同名会自动加后缀;Excel 多 sheet 文件每个 sheet 成一张表 <文件名>_<sheet名>。
1-2 GB 以内比较舒服。DuckDB-Wasm 跑在浏览器主线程的 worker 里,受 V8 单页堆约束(一般 2-4 GB)。Parquet 因为列存 + 压缩通常比 CSV 友好得多——10 GB 的 CSV 可能跑不动,但同等数据的 Parquet 1-2 GB 通常没问题。对超大文件的实战建议:先 LIMIT / WHERE 过滤再聚合,让 DuckDB 的列裁剪和谓词下推帮你省内存。
是真 DuckDB,官方 @duckdb/duckdb-wasm 包,跟 CLI 同源,只是编译目标是 WebAssembly。语法层面 DuckDB 高度兼容 PostgreSQL:常用的 CTE / 窗口函数 / QUALIFY / GROUP BY ALL / LIMIT BY / LIST_AGG / lambda 都有;JSON 列用 -> ->> 访问;时间用 INTERVAL / DATE_TRUNC;类型转换用 ::TYPE。不兼容的地方主要是某些 Postgres 特有的系统视图和存储过程,做数据分析几乎用不上。
能,DuckDB-Wasm 在内存里有完整的写入支持。你可以 CREATE TABLE foo AS SELECT ...、INSERT INTO foo VALUES (...)、UPDATE foo SET ...、DELETE FROM foo WHERE ...,但所有结果都在浏览器内存里,关闭页面 / 重置 / 刷新都会丢。本工具自动检测 DML/DDL,把改过的表标记为「未保存」并在顶部弹出提示条,每张表可以一键导出 Parquet / CSV / JSON / Excel 四种格式之一,避免数据丢失。查询结果同样支持四种格式导出。
把两个文件分别拖进来后会得到两个表名(比如 events 和 users),直接写 SELECT u.name, COUNT(*) FROM events e JOIN users u ON e.user_id = u.id GROUP BY 1 ORDER BY 2 DESC LIMIT 20,跟普通数据库一样。列名补全:在 SELECT 后面输入 表名. 编辑器会弹出该表的所有列,按 Tab 补全;表名本身在 FROM 后输入时也会补全。
Parquet 预览器专注「快速看一眼」:拖进去 3 秒看到 schema、统计、前 N 行,包体积小(hyparquet 约 50 KB),首次打开秒开。SQL 工作台(本工具)面向「真分析 + 改数据」:完整 SQL 引擎、多文件 JOIN、聚合/窗口函数/CTE、DML/DDL、多格式导出都能跑,但首次加载 35 MB wasm 需要几秒。只看一眼用预览器,做分析或改数据用本工具。预览器底部的「相关工具」会自动跳到本工具。