Apache Arrow DataFusion 16.0.0 项目更新
发布 2023年1月19日
作者 Apache Arrow PMC (pmc)
简介
DataFusion 是一个使用 Rust 编写的可扩展查询执行框架,它使用 Apache Arrow 作为其内存中格式。它主要面向创建数据密集型分析的开发人员,并提供成熟的 SQL 支持、DataFrame API 和许多扩展点。
基于 DataFusion 的系统在基准测试中表现非常出色,特别是考虑到它们直接操作 parquet 文件而不是首先加载到专门的格式中。一些最近的亮点包括 clickbench 和 Cloudfuse.io 独立查询引擎 页面。
DataFusion 也是长期趋势的一部分,Andy Pavlo 在其 2022 数据库回顾 中明确阐述了这一点。数据库框架正在激增,并且在未来 5 年内,所有 OLAP DBMS 和其他数据密集型应用程序(如机器学习)都将**需要**一个矢量化的高性能查询引擎才能保持相关性。使这种技术如此广泛地可用而无需数百万美元投资的唯一实用方法是通过开源引擎,例如 DataFusion 或 Velox。
本文的其余部分描述了在过去三个月对 DataFusion 进行的改进,以及我们前进方向的一些提示。
社区发展
自 上次更新 以来,我们再次见证了 DataFusion 社区的显著增长。在 OSSRank 上有一些有趣的指标。
DataFusion 16.0.0 版本包含来自 73 位不同贡献者的 543 个 PR,不包括所有依赖项(如 arrow、parquet 和 object_store)的工作,这些依赖项的大部分工作也得到了同一社区的支持。感谢你们的帮助!
最近添加了几个 基于 DataFusion 的新系统
性能 🚀
性能和效率是 DataFusion 的核心价值观。虽然 DataFusion 与同类最佳系统(如 DuckDB 和 Polars)之间仍然存在差距,但 DataFusion 正在迅速缩小差距。过去三个月的性能亮点:
- 使用新的 行格式 使排序和合并速度提高了 30%
- 高级谓词下推,直接在 parquet 上,直接从对象存储中,实现亚毫秒级过滤。
70%
更快的IN
表达式评估 (#4057)- 排序和分区感知优化 (#3969 和 #4691)
- 过滤器选择性分析 (#3868)
运行时资源限制
以前,DataFusion 可能会在某些包含排序、分组或连接的查询中使用无限量的内存。
在 16.0.0 版本中,可以限制 DataFusion 用于排序和分组的内存使用量。我们正在寻求帮助,添加对连接的类似限制,以及扩展我们的算法以选择性地溢出到辅助存储。有关更多详细信息,请参阅 #3941。
SQL 窗口函数
SQL 窗口函数 可用于各种分析,并且 DataFusion 的实现支持得到了显著扩展。
- 自定义窗口框架,例如
... OVER (ORDER BY ... RANGE BETWEEN 0.2 PRECEDING AND 0.2 FOLLOWING)
- 无界窗口框架,例如
... OVER (ORDER BY ... RANGE UNBOUNDED ROWS PRECEDING)
- 支持
NTILE
窗口函数 (#4676) - 支持
GROUPS
模式 (#4155)
改进的连接
连接通常是分析系统中最复杂的操作,DataFusion 16.0.0 提供了重大改进,例如:
- 基于成本的优化器 (CBO) 自动重新排序连接评估、选择算法(合并/哈希)并根据可用统计信息和连接类型 (
INNER
、LEFT
等) 选择构建端 (#4219) - 快速非
column=column
等值连接,例如JOIN ON a.x + 5 = b.y
- 非等值连接的性能更好 (#4562)
流式执行
Datafusion 的一个新兴用例是作为流优先数据平台的基础。一个重要的先决条件是支持可增量计算的查询的增量执行。
在此版本中,DataFusion 现在支持以下流式功能:
- 从无限文件(如 FIFO)中摄取数据 (#4694),
- 检测流式用例中的管道中断查询 (#4694),
- 自动交换连接的输入,以便探测端成为数据流 (#4694),
- 尽可能智能地省略管道中断排序操作 (#4691),
- 更多类型查询的增量执行;例如,涉及有限窗口框架的查询 (#4777)。
这些都是向前迈出的重大一步,我们计划在接下来的几个版本中进行更多改进。
更好的分布式目录支持
16.0.0 增强了对异步目录的支持 (#4607),以更好地支持分布式元数据存储,如 Delta.io 和 Apache Iceberg,这些存储在计划期间需要异步 I/O 以访问远程目录。以前,DataFusion 需要同步访问所有相关的目录信息。
其他 SQL 支持
SQL 支持持续改进,包括以下一些亮点:
- 添加 TPC-DS 查询计划回归测试 #4719
- 支持
PREPARE
语句 #4490 - 日期和时间戳之间的自动强制转换 #4726
- 支持时间戳和 utf8 的类型强制转换 #4312
- 完全支持 time32 和 time64 字面量值 (
ScalarValue
) #4156 - 新函数,包括
uuid()
#4041、current_time
#4054、current_date
#4022 - 压缩 CSV/JSON 支持 #3642
社区还投入了新的 基于 sqllogic 的 测试,以更轻松地持续改进 DataFusion 的质量。
计划序列化和 Substrait
DataFusion 现在支持物理计划的序列化,使用自定义协议缓冲区格式。此外,我们正在添加对 Substrait 的初始支持,这是一种关系代数的跨语言序列化。
如何参与
感谢社区中所有贡献想法、讨论、错误报告、文档和代码的人。能够一起构建如此酷的东西真是令人兴奋!
如果您有兴趣为 DataFusion 贡献力量,我们非常欢迎您加入我们。您可以尝试在您自己的数据和项目上试用 DataFusion,并告诉我们结果,或者贡献一个包含文档、测试或代码的 PR。这里有一个适合初学者的未解决问题列表:此处。
查看我们的 交流文档,了解与社区互动的更多方法。
附录:贡献者致谢
以下是过去三个版本中为该项目贡献了 PR 的人员列表,这些人员来自 git shortlog -sn 13.0.0..16.0.0 .
感谢你们!
113 Andrew Lamb
58 jakevin
46 Raphael Taylor-Davies
30 Andy Grove
19 Batuhan Taskaya
19 Remzi Yang
17 ygf11
16 Burak
16 Jeffrey
16 Marco Neumann
14 Kun Liu
12 Yang Jiang
10 mingmwang
9 Daniël Heres
9 Mustafa akur
9 comphead
9 mvanschellebeeck
9 xudong.w
7 dependabot[bot]
7 yahoNanJing
6 Brent Gardner
5 AssHero
4 Jiayu Liu
4 Wei-Ting Kuo
4 askoa
3 André Calado Coroado
3 Jie Han
3 Jon Mease
3 Metehan Yıldırım
3 Nga Tran
3 Ruihang Xia
3 baishen
2 Berkay Şahin
2 Dan Harris
2 Dongyan Zhou
2 Eduard Karacharov
2 Kikkon
2 Liang-Chi Hsieh
2 Marko Milenković
2 Martin Grigorov
2 Roman Nozdrin
2 Tim Van Wassenhove
2 r.4ntix
2 unconsolable
2 unvalley
1 Ajaya Agrawal
1 Alexander Spies
1 ArkashaJavelin
1 Artjoms Iskovs
1 BoredPerson
1 Christian Salvati
1 Creampanda
1 Data Psycho
1 Francis Du
1 Francis Le Roy
1 LFC
1 Marko Grujic
1 Matt Willian
1 Matthijs Brobbel
1 Max Burke
1 Mehmet Ozan Kabak
1 Rito Takeuchi
1 Roman Zeyde
1 Vrishabh
1 Zhang Li
1 ZuoTiJia
1 byteink
1 cfraz89
1 nbr
1 xxchan
1 yujie.zhang
1 zembunia
1 哇呜哇呜呀咦耶