介绍 Apache Arrow DataFusion Contrib
发布 2022 年 3 月 21 日
作者 Apache Arrow PMC (pmc)
简介
Apache Arrow DataFusion 是一个可扩展的查询执行框架,用 Rust 编写,使用 Apache Arrow 作为其内存格式。
当您想使用 SQL 支持、DataFrame API 或读取和处理 Parquet、JSON、Avro 或 CSV 数据的能力来扩展您的 Rust 项目时,DataFusion 绝对值得一试。DataFusion 的可插拔设计使得在各个方面创建扩展都特别容易构建。
DataFusion 的 SQL、DataFrame 和手动 PlanBuilder API 让用户可以访问复杂的查询优化器和执行引擎,该引擎能够快速、资源高效、并行执行,并充分利用当今的多核硬件。用 Rust 编写意味着 DataFusion 既能提供动态语言的安全性,又能提供编译语言的资源效率。
DataFusion 团队很高兴宣布创建 DataFusion-Contrib GitHub 组织,以支持和加速其他项目。虽然核心 DataFusion 库仍由 Apache 管理,但 contrib 组织为新的 DataFusion 功能提供了更灵活的试验场,并为 DataFusion 扩展提供了一个家。在此公告中,我们很高兴介绍以下首批 DataFusion-Contrib 存储库。
DataFusion-Python
这个项目提供了 DataFusion 核心 Rust 实现的 Python 绑定,允许用户
- 使用熟悉的 SQL 或 DataFrame API 在安全、多线程环境中运行查询,并在 Python 中返回结果
- 为复杂操作创建用户定义函数和用户定义聚合函数
- 在 Python 和底层 Rust 执行引擎之间复制(通过 Apache Arrow 数组)无需额外开销
即将到来的增强功能
团队正致力于公开更多 DataFusion 底层 Rust 实现的功能并改进文档。
如何安装
从 pip
pip install datafusion
或
python -m pip install datafusion
DataFusion-ObjectStore-S3
这个 crate 为查询存储在 S3 或 S3 兼容存储中的数据提供了 ObjectStore 实现。这使得查询 S3 上的数据几乎和查询本地文件一样容易
- 能够创建
S3FileSystem作为 DataFusionExecutionContext的一部分进行注册 - 使用
ctx.register_listing_table注册存储在 S3 上的文件或目录
即将到来的增强功能
当前的优先级是为 S3FileSystem 添加 python 绑定。之后,随着 DataFusion 采用更多该功能,我们将进行异步改进,并且我们正在研究 S3 Select 功能。
如何安装
将以下内容添加到您带有 DataFusion 的 Rust 项目中的 Cargo.toml 中。
datafusion-objectstore-s3 = "0.1.0"
DataFusion-Substrait
Substrait 是一个新兴的标准,它为关系代数(例如表达式和查询计划)提供了一种跨语言的序列化格式。
这个 crate 为 DataFusion 提供了 Substrait 生产者和消费者。生产者将 DataFusion 逻辑计划转换为 Substrait protobuf,消费者则执行相反的操作。
此 crate 的使用示例可以在此处找到。
潜在用例
- 替换自定义 DataFusion protobuf 序列化。
- 使跨 FFI 边界(例如从 Python 到 Rust)传递查询计划变得更容易
- 允许在 DataFusion 中执行 Apache Calcite 查询计划
DataFusion-BigTable
这个 crate 将 Bigtable 实现为 DataFusion 查询的数据源和物理执行器。它目前支持 Bigtable 中的 UTF-8 字符串和 64 位大端有符号整数。从 SQL 的角度来看,它支持使用 =、IN 和 BETWEEN 运算符的简单和复合行键以及投影下推。查询的物理执行由这个 crate 处理,而任何后续的聚合、分组或连接都在 DataFusion 中处理。
即将到来的增强功能
- 谓词下推
- 值范围
- 值正则表达式
- 时间戳范围
- 多线程
- 分区感知执行
- 生产就绪
如何安装
将以下内容添加到您带有 DataFusion 的 Rust 项目中的 Cargo.toml 中。
datafusion-bigtable = "0.1.0"
DataFusion-HDFS
这个 crate 引入了 HadoopFileSystem 作为远程 ObjectStore,它提供了查询 HDFS 文件的能力。对于 HDFS 访问,使用了 fs-hdfs 库。
DataFusion-Tokomak
这个 crate 提供了一个基于 Rust egg 库的基于 e-graph 的 DataFusion 优化框架。e-graph 是一种支持相等饱和优化技术的数据结构。
作为背景,DataFusion 中的优化器框架目前正在 审查中,目标是实现一个更具战略性的长期解决方案,该方案更高效且更易于开发。
在 DataFusion 中使用 egg 的一些好处是
- 实现了手动编写优化通过难以匹敌的优化算法
- 使添加优化规则变得简单且不那么冗长
- 插件框架,可添加更复杂的优化
- Egg 不依赖于规则顺序,并且可以通过同时应用多个规则直到收敛来达到更高的优化水平
- 允许基于成本的优化
这是 DataFusion 一个激动人心的新领域,拥有大量社区参与的机会!
DataFusion-Tui
DataFusion-tui 又名 dft,提供了一个功能丰富的终端应用程序,用于使用 DataFusion。它从 datafusion-cli 中汲取了灵感和一些功能。与 datafusion-cli 相比,此工具的目标是为使用 DataFusion 查询数据提供一个轻量级 SQL IDE 体验。这包括以下目前已实现的功能:
- 选项卡管理,为 DataFusion 查询、结果、
ExecutionContext信息和日志提供清晰且结构化的组织- SQL 编辑器
- 用于编写 SQL 查询的文本编辑器
- 查询历史
- 已执行查询的历史记录、执行时间以及返回的行数
-
ExecutionContext信息- 公开使用的物理优化器信息和设置的
ExecutionConfig设置
- 公开使用的物理优化器信息和设置的
- 日志
- 来自
dft、DataFusion 和任何依赖库的日志
- 来自
- SQL 编辑器
- 支持自定义
ObjectStores- S3
- 从
~/.datafusionrc预加载 DDL,以便在启动时拥有本地“数据库”
即将到来的增强功能
- SQL 编辑器
- 将查询结果写入文件的命令
- 多个 SQL 编辑器选项卡
- 公开更多来自
ExecutionContext的信息 - 一个提供函数信息的帮助选项卡
- 查询自定义
TableProvider,例如 DeltaTable 或 BigTable
DataFusion-Streams
DataFusion-Stream 是一个新的测试平台,用于在 DataFusion 中创建 StreamProvider,这将能够查询流式数据源,例如 Apache Kafka。此功能的实现目前正在设计中,并正在积极审查中。设计最终确定后,该特性和相关数据结构将重新添加到核心 DataFusion crate 中。
DataFusion-Java
这个 项目 创建了一组 DataFusion 的初始 Java 绑定。该项目目前处于维护模式,正在寻找维护者来推动未来的开发。
如何参与
如果您有兴趣为 DataFusion 做出贡献,并了解最先进的查询处理技术,我们非常欢迎您加入我们的旅程!您可以通过在您自己的数据和项目上试用 DataFusion,并告诉我们进展如何,或者通过提交带有文档、测试或代码的 PR 来提供帮助。适合初学者的开放问题列表在此
了解在 DataFusion-Contrib 中创建新扩展的最佳方式是在 Apache Software Foundation Slack 工作区的 #arrow-rust 频道上联系我们。
您还可以查看我们新的沟通文档,了解更多与社区互动的方式。
如果您想为这些 DataFusion-Contrib 存储库做出贡献,上面提供了每个存储库的链接。