Apache Arrow DataFusion 26.0.0
已发布 2023年6月24日
作者 The Apache Arrow PMC (pmc)
自从上次更新以来,DataFusion 已经经历了 6 个月的飞速发展:社区不断壮大,添加了许多功能,性能得到了提高,并且我们正在讨论发展成为我们自己的顶级 Apache 项目。
背景
Apache Arrow DataFusion 是一个可扩展的查询引擎和数据库工具包,使用 Rust 编写,并使用 Apache Arrow 作为其内存格式。
DataFusion,连同 Apache Calcite、Facebook 的 Velox 和类似技术,是下一代“解构数据库”架构的一部分,其中新系统构建在快速、模块化组件的基础上,而不是单个紧密集成的系统。
虽然诸如 Spark、DuckDB 和 Pola.rs 等单个紧密集成的系统都是很棒的技术,但我们的社区认为,任何开发新的数据密集型应用程序(例如未来 5 年机器学习中常见的那些应用程序)的人都将需要一个高性能、向量化的查询引擎才能保持竞争力。在不投资数百万美元构建新的紧密集成的引擎的情况下,获得此类技术的唯一可行方法是通过像 DataFusion 这样的开源项目以及类似的使能技术,例如 Apache Arrow 和 Rust。
DataFusion 主要面向创建其他数据密集型分析的开发人员,并提供
- 高性能、原生、并行流式执行引擎
- 成熟的 SQL 支持,具有子查询、窗口函数、分组集等
- 内置支持 Parquet、Avro、CSV、JSON 和 Arrow 格式,并且易于扩展以支持其他格式
- 原生 DataFrame API 和 python 绑定
- 文档完善的源代码和架构,旨在进行自定义以满足下游项目需求
- 高质量、易于使用的代码,每 2 周发布到 crates.io
- 热情开放的社区,由备受推崇且广为人知的 Apache 软件基金会管理
本文的其余部分重点介绍我们在过去 6 个月内对 DataFusion 所做的一些改进,并预览了我们的发展方向。您可以在详细的 CHANGELOG 中查看所有更改的列表。
(甚至) 更好的性能
各种基准测试表明,DataFusion 非常接近甚至更快地达到分析性能的最新水平(目前看来是 DuckDB)。 我们不断努力提高性能(参见 #5546 以获取列表),并希望在此领域获得更多帮助。
DataFusion 现在通过跨多个内核并行化,显著加快了读取单个大型 Parquet 文件的速度。 此外,由于 arrow-rs 中的上游改进,读取 JSON 和 CSV 文件的原生速度也提高了 2.5 倍 JSON 读取器和 CSV 读取器。
此外,我们将 arrow-rs 行格式集成到 DataFusion 中,从而实现了高达 2-3 倍的排序和合并速度。
改进的文档和网站
发展 DataFusion 社区的一部分是确保 DataFusion 的功能得到理解,并且易于贡献和参与。为此,网站已清理干净,架构指南已扩展,路线图已更新,并创建了几个概述性演讲
新功能
更多流式传输,更少内存
我们在 流式执行路线图上取得了重大进展,例如 无界数据源、流式分组、优化器中的复杂 排序和 重新分区 改进,以及对 对称哈希连接的支持(在伟大的 Synnada 博客文章中了解有关该主题的更多信息)。 这些功能共同 1) 使使用 DataFusion 构建流式系统变得更容易,这些系统可以在(或永远)看到输入结束之前逐步生成输出,以及 2) 允许一般查询使用更少的内存并更快地生成结果。
我们还改进了运行时 内存管理系统,以便 DataFusion 现在保持在其声明的内存预算内 生成运行时错误。
DML 支持 (INSERT
、DELETE
、UPDATE
等)
构建高性能数据系统的一部分包括写入数据,DataFusion 支持多种用于创建新文件的功能
INSERT INTO
和SELECT ... INTO
支持内存支持和 CSV 表- 用于将数据写入 TableProvider 的新 API
我们正在努力使用更易于使用的 COPY INTO 语法、更好地支持写入 parquet、JSON 和 AVRO 等 - 请参阅我们的 跟踪史诗 了解更多详细信息。
时间戳和间隔
SQL 引擎成熟的一个标志是它如何处理时间戳、日期、时间和间隔算术的棘手世界。 DataFusion 在这方面具有完整的功能,并且行为符合您的预期,支持诸如此类的查询
SELECT now() + '1 month' FROM my_table;
我们仍然有很长的 日期和时间改进,我们也在努力。
查询结构化类型 (List
和 Struct
s)
Arrow 和 Parquet 很好地支持嵌套数据,DataFusion 让您可以轻松查询此类 Struct
和 List
。 例如,您可以使用 DataFusion 读取和查询 JSON Datasets for Exploratory OLAP - Mendeley Data 像这样
----------
-- Explore structured data using SQL
----------
SELECT delete FROM 'twitter-sample-head-100000.parquet' WHERE delete IS NOT NULL limit 10;
+---------------------------------------------------------------------------------------------------------------------------+
| delete |
+---------------------------------------------------------------------------------------------------------------------------+
| {status: {id: {$numberLong: 135037425050320896}, id_str: 135037425050320896, user_id: 334902461, user_id_str: 334902461}} |
| {status: {id: {$numberLong: 134703982051463168}, id_str: 134703982051463168, user_id: 405383453, user_id_str: 405383453}} |
| {status: {id: {$numberLong: 134773741740765184}, id_str: 134773741740765184, user_id: 64823441, user_id_str: 64823441}} |
| {status: {id: {$numberLong: 132543659655704576}, id_str: 132543659655704576, user_id: 45917834, user_id_str: 45917834}} |
| {status: {id: {$numberLong: 133786431926697984}, id_str: 133786431926697984, user_id: 67229952, user_id_str: 67229952}} |
| {status: {id: {$numberLong: 134619093570560002}, id_str: 134619093570560002, user_id: 182430773, user_id_str: 182430773}} |
| {status: {id: {$numberLong: 134019857527214080}, id_str: 134019857527214080, user_id: 257396311, user_id_str: 257396311}} |
| {status: {id: {$numberLong: 133931546469076993}, id_str: 133931546469076993, user_id: 124539548, user_id_str: 124539548}} |
| {status: {id: {$numberLong: 134397743350296576}, id_str: 134397743350296576, user_id: 139836391, user_id_str: 139836391}} |
| {status: {id: {$numberLong: 127833661767823360}, id_str: 127833661767823360, user_id: 244442687, user_id_str: 244442687}} |
+---------------------------------------------------------------------------------------------------------------------------+
----------
-- Select some deeply nested fields
----------
SELECT
delete['status']['id']['$numberLong'] as delete_id,
delete['status']['user_id'] as delete_user_id
FROM 'twitter-sample-head-100000.parquet' WHERE delete IS NOT NULL LIMIT 10;
+--------------------+----------------+
| delete_id | delete_user_id |
+--------------------+----------------+
| 135037425050320896 | 334902461 |
| 134703982051463168 | 405383453 |
| 134773741740765184 | 64823441 |
| 132543659655704576 | 45917834 |
| 133786431926697984 | 67229952 |
| 134619093570560002 | 182430773 |
| 134019857527214080 | 257396311 |
| 133931546469076993 | 124539548 |
| 134397743350296576 | 139836391 |
| 127833661767823360 | 244442687 |
+--------------------+----------------+
一路向下的子查询
DataFusion 可以通过将许多不同的子查询重写为连接来运行它们。 至少在过去一年中,它已经能够运行整套 TPC-H 查询,但最近我们对该逻辑进行了重大改进,足以运行 TPC-DS 基准测试中的几乎所有查询。
社区和项目增长
自从 上次更新以来的六个月里,DataFusion 社区经历了显着增长。 在 17.0.0
和 26.0.0
版本之间,DataFusion 合并了来自 107 位不同贡献者的 711 个 PR,不包括我们核心依赖项(例如 arrow、parquet 和 object_store)的所有工作,其中大部分由同一社区提供支持。
此外,我们还在 Apache Arrow 项目中增加了 7 位新提交者和 1 位新 PMC 成员,他们主要关注 DataFusion,并且我们了解了一些正在使用 DataFusion 的很酷的 新系统。 鉴于社区的增长和对项目的兴趣,我们还阐明了 使命声明,并且正在讨论将 DataFusion“毕业”到新的顶级 Apache 软件基金会项目。
如何参与
感谢社区中所有贡献想法、讨论、错误报告、文档和代码的人。 能够共同创新下一代数据库架构,真是令人兴奋!
如果您有兴趣为 DataFusion 做出贡献,我们非常欢迎您加入我们。 您可以在自己的一些数据和项目上试用 DataFusion,让我们知道情况如何,或者通过文档、测试或代码贡献 PR。 适合初学者的未解决问题列表位于 此处。
查看我们的 交流文档,了解更多与社区互动的方式。