本地优先的分析不需要数据库服务器
2026-11-03
9 分钟阅读
Ilya Boyandin 与 Geertjan Wielenga 和 Tim Cox 对话
TL;DR: Ilya Boyandin 在一个地理空间副项目中首次使用 DuckDB,在浏览器中分析数据而无需数据库后端。他后来把那套设置变成了 SQLRooms,一个用于本地优先分析应用程序的开源框架。Foursquare 的 Spatial Desktop 是迄今为止建立在其上的最大应用。
Ilya Boyandin 是一名软件工程师,也是 SQLRooms 的创造者。他拥有地理空间数据可视化博士学位。在加入 Unfolded(开源项目 deck.gl 和 kepler.gl 背后的公司)之前,他在 Teralytics 从事城市出行分析。Foursquare 后来收购了 Unfolded,他自那以后一直在那里工作。
DuckDB 如何进入画面
在 Teralytics,Ilya 的团队使用 ClickHouse。像 DuckDB 一样,它是列式的、为分析而构建的,但它通常运行在集群中配置的服务器上。"ClickHouse 可以在本地使用,但它并不是真的为此设计的,不像 DuckDB。"
他首次在 Flowmap.city 中使用 DuckDB,这是一个可视化出行流的副项目,他仍在维护。他的基础设施预算很少,而 DuckDB 已经有在浏览器中运行的 WebAssembly 构建。在 Flowmap.city 中,用户把文件上传到对象存储,这很便宜或常常免费。当有人打开一个项目时,DuckDB-Wasm 在浏览器中启动,并通过 s3:// 协议从桶中加载文件:
sql
SELECT *
FROM 's3://bucket/project/flows.parquet';
"他们可以在浏览器中完成所有分析和可视化,"Ilya 说,"这非常方便,而且对基础设施的要求非常低。"
Flowmap.city 向他展示了一个分析应用程序可以在背后没有数据库服务器的情况下工作。
从副项目到 SQLRooms
为 Flowmap.city,Ilya 构建了表视图、SQL 编辑器、schema 树和浏览器中的查询执行。没有一样是出行数据特有的。他把这些部分提取成一个名为 SQLRooms 的独立框架,他继续以开源方式开发它。
SQLRooms 是一组用于在 React 中创建 DuckDB 支持的分析应用程序的构建块。开发者只组合他们的应用需要的包和状态切片。它的中心是 Room,一个自包含的工作区,持有数据以及对数据所做的分析。每个 Room 连接到它自己的 DuckDB 实例,在设备上原生运行或作为浏览器中的 WebAssembly。框架的 DuckDB 包装器处理文件加载,所以数据一添加就可以查询。所有计算都在用户自己的机器上进行,无论是浏览器标签页还是桌面应用。该框架还内置了对编写和运行 SQL 的 AI 代理的支持。
最快的入门方式是最小示例,一个小型 Vite 和 React 应用,加载一个 CSV 文件并对它运行 SQL 查询:
sql
SELECT *
FROM 'sales.csv'
LIMIT 10;
Foursquare 之外的开发者也建立在该框架之上。Amar Harolikar 定制 SQLRooms,用自然语言分析一个 1100 万行、1.6 GB 的 CSV 文件,完全在浏览器中。Cosmograph,一个由 Nikita Rokotyan 及其团队构建的用于可视化大型网络图和机器学习嵌入的工具,是另一个建立在该框架上的应用。
Ilya 对本地优先软件的兴趣塑造了该框架。"你应该拥有你的数据。它应该住在你的电脑上,而不是云中。它可以通过云同步,但由你决定何时保持本地、何时不。"
一个数据库文件,一个分析项目
在 SQLRooms 应用程序中,DuckDB 可以把项目连同数据一起存储。在 Spatial Desktop 中,"你创建的项目文件实际上是一个 DuckDB 数据库文件,我们在其中存储用户添加到项目的数据以及他们在其中创建的所有工件。"打开一个项目是一次 ATTACH:
sql
ATTACH 'project.duckdb';
整个项目然后住在一个文件中,用户可以像任何其他文档一样移动它。Ilya 目前在 SQLRooms 上的工作建立在这个想法之上(见下文)。
在 Foursquare 把 SQLRooms 投入使用
迄今为止建立在 SQLRooms 上的最大应用是 Foursquare Spatial Desktop,一个用于可视化地理空间数据的免费桌面应用。任何人都可以注册并用自己的数据使用它。只有嵌入式 AI 代理是付费的。Foursquare 还把 SQLRooms 用于内部分析工具。
Spatial Desktop 跟随了 kepler.gl(免费的仅客户端工具)和 Foursquare Studio(在云中托管的商业版本)。它是这些中第一个使用 DuckDB 的,由 Ilya 提议。"对这个特定产品,我认为 DuckDB 就是完美契合,"他说。"我不会说我们考虑过替代品。"SQLite 也是可嵌入的,他说,但它不是列式的,也不是为较大数据集上的分析设计的。
DuckDB 随应用一起发布,所以用户不需要额外安装任何东西。Ilya 承认桌面应用使共享项目和共同编辑更难。作为交换,查询不等待网络,数据留在用户的机器上。Foursquare 也没有数据库服务器要运行。现代笔记本电脑很强大,他补充说,它们的 GPU 擅长可视化。"现在桌面应用有点复兴。"
Foursquare 还有一个其地理空间代理的浏览器版本,通过 MotherDuck 读取数据。由于 MotherDuck 是云中的 DuckDB,团队复用了代理用于生成 SQL 的大部分指令。
当代理写 SQL 时
Spatial Desktop 的工作大约在 AI 代理变得可用的时候开始。"SQL 和 AI 代理的这种组合实际上相当强大,"Ilya 说。"SQL 有那么长的历史,网上有那么多文档解释如何使用它,而 LLM 相当擅长生成它。"用户提问,代理编写并运行 DuckDB 查询,所以他们不需要懂 SQL。
界面因此改变了。"在最初版本中,SQL 编辑器在应用中非常显眼。然后我们开始用代理做更多事情,现在它默认隐藏。"查询仍然在那里。用户可以打开它们检查代理做了什么,他们也可以写自己的。
即时地理空间处理
Spatial Desktop 已经用从数万个点到数 GB 的数据集测试过。它用 deck.gl 渲染地图,一旦地图持有数十万个对象就会变慢。团队用建立在 DuckDB 空间扩展上的动态瓦片绕过了这一点。
Web 地图通常加载当前缩放级别下视野区域的预生成瓦片。Spatial Desktop 改为在查询时生成那些瓦片。一个查询把要素过滤到视口。当用户缩小时,它简化多边形,并在需要的地方采样数据。空间扩展的 ST_AsMVT 函数然后把结果编码为 MVT 中的二进制瓦片,一种广泛支持的格式:
sql
INSTALL spatial;
LOAD spatial;
SELECT ST_AsMVT({
'geometry': ST_AsMVTGeom(
geometry,
ST_Extent(ST_TileEnvelope(z, x, y)),
4096,
256,
false
),
'id': id
}) AS tile
FROM features
WHERE ST_Intersects(geometry, ST_TileEnvelope(z, x, y));
Ilya 说这让应用"显示比 deck.gl 一次能渲染的更多的数据"。
SQLRooms 接下来走向哪里
Spatial Desktop 中的项目文件指向 Ilya 在 SQLRooms 中开发的一个更广泛想法,DuckDB 文件既携带分析也携带数据。他正在构建一个 Canvas 模块,带有 SQL 查询单元格和 Vega-Lite 图表单元格,以及一个 Notebooks 模块。下面的引擎跟踪单元格如何相互依赖,并在数据变化时重新运行下游单元格。
他还在添加基于 Loro CRDT 库的实时协作。因为 DuckDB 把数据视为只读,只有界面状态需要在协作者之间同步。该状态本身可以存储在 DuckDB 中,要么在共享服务器上,要么在本地机器上用于离线工作。
在阿姆斯特丹的 DuckCon #7 上,Ilya 展示了一个 SQLRooms 命令行工具,它与 DuckDB 数据库一起工作并以笔记本风格呈现分析。方向是一个单一的 DuckDB 文件持有一个完整的分析工作区,某人可以在别处打开并继续。设计仍在变化。
观看 DuckCon 演讲
Ilya 在 DuckCon #7 的五分钟演讲简要介绍了这个方向。
SQLRooms 是开源的,可在 sqlrooms.org 获取,那里的示例应用是一个好的起点。Flowmap.city 和 Foursquare Spatial Desktop 可以免费试用。
我们要感谢 Ilya 的对话。你可以在他的博客 上关注他关于 DuckDB 和 SQLRooms 的写作。如果你正在读这篇文章、在使用 DuckDB,并想分享你的故事,请给我们发邮件到 quack@duckdb.org。