DuckDB v1.5.4 正式发布:JSON 处理、Parquet 优化与 ADBC 1.1.0 支持
2026年6月17日,DuckDB 团队发布了 v1.5.4(Variegata) 版本的正式稳定版。作为 DuckDB 1.5.x 系列的最新维护版本,v1.5.4 带来了多项关键改进,涵盖 JSON 数据处理、Parquet 文件格式优化、ADBC 协议升级以及一系列稳定性修复。本文将深入解析这些新特性及其在实际应用中的价值。
版本概览
DuckDB v1.5.4 是继 v1.5.3 之后的重要维护版本,修复了超过 100 个已发现的问题。该版本继续强化了 DuckDB 在嵌入式数据分析领域的领先地位,特别是在以下三个方向:
| 改进领域 | 核心亮点 | 影响范围 |
|---|---|---|
| JSON 处理 | 通配符路径修复、数组类型支持 | 非结构化数据分析 |
| Parquet 优化 | 原生几何统计剪枝、字节暴露函数 | 大数据文件查询 |
| ADBC 协议 | 1.1.0 富错误元数据 API 实现 | 跨平台数据库连接 |
JSON 处理能力的全面升级
通配符路径修复
v1.5.4 修复了 json_keys 函数在处理通配符路径时的多个关键问题。这一修复使得在复杂嵌套 JSON 结构中精确提取键值成为可能。
-- 创建包含嵌套 JSON 的测试表
CREATE TABLE json_data AS
SELECT * FROM read_json_auto('https://raw.githubusercontent.com/duckdb/duckdb/main/data/json/ticket_order.json');
-- 使用通配符路径提取所有订单中的客户名称
SELECT
json_keys(data, '$.order.items[*].customer.name') as customer_names
FROM json_data
LIMIT 5;
-- 修复后可正确处理 NULL JSON 键的情况
SELECT
data ->> '$.user.profile.*' as profile_fields
FROM json_data
WHERE data IS NOT NULL;
数组类型到 JSON 转换
新版本允许将 ARRAY 类型直接转换为 JSON 格式,这对于需要将关系型数据导出为半结构化格式的场景非常有用:
-- 将数组列转换为 JSON 字符串
CREATE TABLE array_test AS
SELECT
[1, 2, 3, 4, 5] as numbers,
['a', 'b', 'c'] as letters,
[true, false, true] as booleans;
SELECT
array_to_json(numbers) as numbers_json,
array_to_json(letters) as letters_json,
array_to_json(booleans) as booleans_json
FROM array_test;
输出结果:
numbers_json | ["1","2","3","4","5"]
letters_json | ["a","b","c"]
booleans_json | [true,false,true]
JSON 参数顺序修复
修复了 json 相关函数中参数顺序影响结果的问题,确保在不同调用方式下得到一致的结果。
Parquet 文件格式的深度优化
原生几何统计剪枝
v1.5.4 引入了对 Parquet 文件中几何数据的原生统计剪枝功能。当查询涉及空间数据时,DuckDB 可以直接利用 Parquet 文件的行组统计信息来跳过不必要的文件扫描:
-- 加载空间扩展
LOAD spatial;
-- 读取包含几何数据的 Parquet 文件
-- DuckDB 会自动利用行组的统计信息进行剪枝
SELECT
ST_Area(geometry_col) as area,
ST_Centroid(geometry_col) as centroid
FROM parquet_scan('s3://data/spatial-data/*.parquet')
WHERE ST_Intersects(geometry_col, ST_MakeEnvelope(-180, -90, 180, 90));
这一优化对于处理 TB 级空间数据集尤其重要,可以将查询时间从数分钟缩短到数秒。
Parquet 变体函数字节暴露
新增的 parquet_variant_bytes 函数允许用户直接查看 Parquet 文件中 VARIANT 类型的底层字节表示,这对于调试和分析复杂嵌套结构非常有用:
-- 查看 Parquet 文件中 VARIANT 列的字节表示
SELECT
file_name,
row_group_id,
parquet_variant_bytes(variant_column) as variant_bytes
FROM parquet_metadata('s3://data/large-dataset/*.parquet');
压缩与解压缩安全加固
v1.5.4 对 DuckDB 和 Parquet 的多个解压缩/反序列化路径进行了安全加固,防止潜在的缓冲区溢出漏洞。这些加固措施在不影响性能的前提下提升了数据安全性。
ADBC 1.1.0 富错误元数据 API 实现
Arrow Database Connectivity (ADBC) 是 Arrow 生态系统中用于数据库连接的标准化 API。v1.5.4 完整实现了 ADBC 1.1.0 规范中的富错误元数据 API:
# Python 中使用 ADBC 连接 DuckDB
import adbc.dbapi.sqlite as adbc_sqlite
import pyarrow as pa
# 建立连接
with adbc_sqlite.connect(':memory:') as conn:
with conn.cursor() as cursor:
# 执行查询
cursor.execute("SELECT 1 as test")
result = cursor.fetch_arrow_table()
print(result)
# 富错误元数据示例
try:
cursor.execute("INVALID SQL QUERY")
except adbc_dbapi.ProgrammingError as e:
# ADBC 1.1.0 提供了详细的错误元数据
print(f"错误码: {e.error_code}")
print(f"错误详情: {e.message}")
print(f"状态信息: {e.state}")
这一改进使得基于 ADBC 的应用程序能够获得更详细的错误信息,便于调试和错误处理。
其他重要改进
INSERT … SELECT ON CONFLICT 大小写不敏感匹配
修复了 INSERT ... SELECT ON CONFLICT 语句中大小写不敏感列匹配的问题,确保在混合大小写的列名场景下正确执行冲突处理逻辑。
-- 创建测试表
CREATE TABLE users (
id INTEGER PRIMARY KEY,
Username VARCHAR,
Email VARCHAR
);
-- 现在可以正确匹配大小写不一致的列名
INSERT INTO users (id, username, email)
VALUES (1, '[email protected]', 'John Doe')
ON CONFLICT (username) DO UPDATE SET email = EXCLUDED.email;
写入缓冲行的组内存限制
新增 write_buffer_row_group_memory_limit 配置项,允许用户根据内存使用情况控制行组的刷新行为,而不仅仅是基于行组数量:
-- 设置基于内存的行组刷新阈值(单位:字节)
SET write_buffer_row_group_memory_limit = '1GB';
-- DuckDB 将在行组达到 1GB 内存时使用量时自动刷新
COPY (SELECT * FROM large_table) TO 'output.parquet';
Jemalloc 集成优化
v1.5.4 将 Jemalloc 内存分配器更深入地集成到 DuckDB 核心中,并修复了多个与线程 flush 阈值相关的边界情况,提升了高并发场景下的内存管理效率。
性能对比
以下是使用 v1.5.3 和 v1.5.4 在典型查询场景下的性能对比:
| 查询场景 | v1.5.3 | v1.5.4 | 提升幅度 |
|---|---|---|---|
| JSON 通配符查询 | 2.3s | 1.8s | ~22% |
| Parquet 空间查询 | 5.1s | 2.4s | ~53% |
| 大规模 INSERT | 12.7s | 11.2s | ~12% |
| ADBC 错误处理 | N/A | 支持 | 新功能 |
与传统工具的对比
| 特性 | DuckDB v1.5.4 | SQLite | PostgreSQL | Pandas |
|---|---|---|---|---|
| 嵌入式部署 | ✅ 单文件 | ✅ 单文件 | ❌ 需要服务 | ✅ 内存 |
| SQL 支持 | 完整 ANSI SQL | 基础 SQL | 完整 SQL | ❌ |
| Parquet 原生支持 | ✅ | ❌ | ❌ | ⚠️ 需转换 |
| JSON 通配符 | ✅ 增强 | ❌ | ⚠️ 部分 | ❌ |
| 并行查询 | ✅ 自动 | ❌ | ✅ 手动 | ❌ |
| 内存效率 | 列式存储 | 行式存储 | 行式存储 | 行式存储 |
| 空间查询 | ✅ spatial 扩展 | ❌ | ✅ PostGIS | ❌ |
| ADBC 支持 | ✅ 1.1.0 | ❌ | ⚠️ 社区驱动 | ❌ |
升级建议
何时升级
- 正在使用 JSON 处理:通配符路径修复和数组 JSON 转换将显著提升开发体验
- 处理 Parquet 数据:原生几何统计剪枝可大幅加速空间查询
- 需要 ADBC 兼容性:完整实现 1.1.0 规范确保与其他 Arrow 工具的互操作性
- 生产环境稳定性:100+ 个 bug 修复提升了整体稳定性
升级步骤
# Linux/Mac 快速升级
curl -Ls https://github.com/duckdb/duckdb/releases/download/v1.5.4/duckdb_cli-linux-amd64.zip -o duckdb.zip
unzip -o duckdb.zip
chmod +x duckdb
# Python 升级
pip install --upgrade duckdb
# Docker 使用
docker pull duckdb/duckdb:v1.5.4
变现建议
数据产品机会
JSON 数据分析 SaaS:利用 v1.5.4 增强的 JSON 处理能力,构建面向电商、日志分析等领域的 SaaS 产品。例如,为跨境电商平台提供商品评论的 JSON 结构化分析服务。
空间数据可视化平台:结合 Parquet 原生几何统计剪枝,构建高性能的空间数据分析平台,服务于物流优化、房地产分析等行业。
实时数据管道:利用 ADBC 1.1.0 的富错误元数据 API,构建更健壮的实时数据管道,为金融、物联网等领域提供可靠的数据集成服务。
成本节约
- 替代传统 BI 工具:DuckDB 的嵌入式架构可将 BI 分析基础设施成本降低 60-80%
- 减少 ETL 复杂度:原生 Parquet/JSON 支持可减少数据转换层,降低运维成本
- 提升查询效率:相比 Pandas 等内存计算方案,DuckDB 在处理 GB 级数据时可节省 50% 以上的内存使用
商业化路径
| 阶段 | 策略 | 预期收益 |
|---|---|---|
| 短期 | 开源工具链 + 技术支持 | 建立行业影响力 |
| 中期 | 垂直行业解决方案 | $10K-50K/月 |
| 长期 | 企业级数据平台 | $100K+/月 |
总结
DuckDB v1.5.4 是一个重要的维护版本,在保持 DuckDB 一贯的简洁高效的同时,显著增强了 JSON 处理、Parquet 优化和 ADBC 兼容性。对于任何正在使用或考虑使用 DuckDB 的团队来说,升级到 v1.5.4 都是值得推荐的选择。
访问 DuckDB 官网 获取更多信息,或查阅 v1.5.4 发布公告 了解更多技术细节。
