DuckDB与PyArrow在S3查询性能上的对比分析
2025-05-06 22:50:41作者:魏献源Searcher
概述
在数据分析领域,DuckDB和PyArrow都是广受欢迎的工具。本文通过一个实际案例,对比分析了这两种工具在查询S3存储的Parquet文件时的性能差异。案例中,用户发现DuckDB的查询速度比PyArrow慢了约10倍,这引发了我们对两种工具内部工作机制的深入探讨。
测试环境与数据
测试使用了存储在S3上的地理Parquet文件,采用Hive分区方式组织(按年/月/日分区)。数据集总大小约28GB,包含63个文件,其中最大的单个文件约1.8GB。数据按device_id排序,测试查询特定日期和设备ID的记录。
查询性能对比
测试查询的基本形式为:
SELECT *
FROM dataset
WHERE year = 2025 AND
month = 1 AND
day = 1 AND
device_id IN (设备ID列表) AND
mmsi IN (MMSI列表)
PyArrow实现使用了箭头计算表达式:
filter = (
(pc.field('year') == 2025) &
(pc.field('month') == 1) &
(pc.field('day') == 1) &
(pc.field('device_id').isin(hashed_ids)) &
(pc.field('mmsi').isin(mmsis))
)
测试结果显示:
- PyArrow查询耗时约2.5秒
- DuckDB查询耗时约35秒
性能差异原因分析
通过日志分析发现,虽然两者都读取相同的4个Parquet文件,但DuckDB存在以下问题:
-
重复读取问题:DuckDB会多次读取相同的字节范围,这在处理大文件(如1.8GB的文件)时尤为明显。
-
查询优化差异:PyArrow的过滤实现可能更高效地利用了Parquet文件的统计信息和索引。
-
S3访问模式:DuckDB的S3客户端实现可能没有PyArrow优化得好,导致更多的网络请求。
解决方案与优化
开发团队提出了几个可能的优化方向:
-
使用IN替代ANY:虽然测试显示性能提升有限,但在某些场景下可能有效。
-
等待修复补丁:开发团队已经识别到问题并提交了修复补丁(PR #16224)。
-
配置调整:可能需要调整DuckDB的并行度和内存设置以获得更好的性能。
结论
对于S3上的Parquet文件查询,PyArrow在当前测试中表现出明显优势。DuckDB团队正在积极解决性能问题,用户可以考虑:
- 对于性能敏感的应用,暂时使用PyArrow
- 关注DuckDB的更新,特别是针对S3查询的优化
- 根据具体场景进行性能测试,选择最适合的工具
随着DuckDB的持续发展,预期其在云存储查询性能方面会有显著提升,为用户提供更多选择。
登录后查看全文
热门项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0191
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0117
Step-3.7-FlashStep-3.7-Flash是一个拥有 1980 亿参数的稀疏混合专家(MoE)视觉语言模型,由 1960 亿参数的语言主干网络和 18 亿参数的视觉编码器组合而成,具备原生图像理解能力。Python00
JoyAI-EchoJoyAI-Echo,这是一个独立的、仅用于推理的版本,旨在实现分钟级多镜头音视频生成。它采用了经过蒸馏的DMD生成器、配对的跨模态记忆以及故事级别的一致性。其性能的核心在于,一个跨模态视听记忆库能够在长达五分钟的视频中保持角色外观和语音音色的一致性。同时,一个训练后处理流程将基于记忆的强化学习与分布匹配蒸馏相结合,实现了7.5倍的速度提升,显著增强了视觉质量和对齐效果。00
omega-aiOmega-AI:基于java打造的深度学习框架,帮助你快速搭建神经网络,实现模型推理与训练,引擎支持自动求导,多线程与GPU运算,GPU支持CUDA,CUDNN。Java04
llm-universe本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/Jupyter Notebook09
项目优选
收起
暂无描述
Dockerfile
764
4.97 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
857
1.92 K
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
680
1.33 K
Ascend Extension for PyTorch
Python
719
875
deepin linux kernel
C
32
16
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
456
438
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.08 K
1.1 K
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
150
252
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
303
117
昇腾LLM分布式训练框架
Python
178
220