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 和类似技术,是下一代“解构数据库”架构的一部分,其中新系统构建在快速、模块化组件的基础上,而不是单个紧密集成的系统。

虽然诸如 SparkDuckDBPola.rs 等单个紧密集成的系统都是很棒的技术,但我们的社区认为,任何开发新的数据密集型应用程序(例如未来 5 年机器学习中常见的那些应用程序)的人都将需要一个高性能、向量化的查询引擎才能保持竞争力。在不投资数百万美元构建新的紧密集成的引擎的情况下,获得此类技术的唯一可行方法是通过像 DataFusion 这样的开源项目以及类似的使能技术,例如 Apache ArrowRust

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 支持 (INSERTDELETEUPDATE 等)

构建高性能数据系统的一部分包括写入数据,DataFusion 支持多种用于创建新文件的功能

  • INSERT INTOSELECT ... INTO 支持内存支持和 CSV 表
  • 用于将数据写入 TableProvider 的新 API

我们正在努力使用更易于使用的 COPY INTO 语法、更好地支持写入 parquet、JSON 和 AVRO 等 - 请参阅我们的 跟踪史诗 了解更多详细信息。

时间戳和间隔

SQL 引擎成熟的一个标志是它如何处理时间戳、日期、时间和间隔算术的棘手世界。 DataFusion 在这方面具有完整的功能,并且行为符合您的预期,支持诸如此类的查询

SELECT now() + '1 month' FROM my_table;

我们仍然有很长的 日期和时间改进,我们也在努力。

查询结构化类型 (ListStructs)

Arrow 和 Parquet 很好地支持嵌套数据,DataFusion 让您可以轻松查询此类 StructList。 例如,您可以使用 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.026.0.0 版本之间,DataFusion 合并了来自 107 位不同贡献者的 711 个 PR,不包括我们核心依赖项(例如 arrowparquetobject_store)的所有工作,其中大部分由同一社区提供支持。

此外,我们还在 Apache Arrow 项目中增加了 7 位新提交者和 1 位新 PMC 成员,他们主要关注 DataFusion,并且我们了解了一些正在使用 DataFusion 的很酷的 新系统。 鉴于社区的增长和对项目的兴趣,我们还阐明了 使命声明,并且正在讨论将 DataFusion“毕业”到新的顶级 Apache 软件基金会项目。

如何参与

感谢社区中所有贡献想法、讨论、错误报告、文档和代码的人。 能够共同创新下一代数据库架构,真是令人兴奋!

如果您有兴趣为 DataFusion 做出贡献,我们非常欢迎您加入我们。 您可以在自己的一些数据和项目上试用 DataFusion,让我们知道情况如何,或者通过文档、测试或代码贡献 PR。 适合初学者的未解决问题列表位于 此处

查看我们的 交流文档,了解更多与社区互动的方式。