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 提供了一个 ObjectStore 实现,用于查询存储在 S3 或兼容 S3 的存储中的数据。这使得查询 S3 上的数据几乎与查询本地文件一样容易

  • 能够创建 S3FileSystem 并将其注册为 DataFusion ExecutionContext 的一部分
  • 使用 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

这个 crateBigtable 实现为 DataFusion 查询的数据源和物理执行器。它目前支持 Bigtable 中的 UTF-8 字符串和 64 位大端符号整数。从 SQL 的角度来看,它支持简单和复合行键,并支持 =INBETWEEN 运算符以及投影下推。查询的物理执行由该 crate 处理,而任何后续的聚合、分组或连接都在 DataFusion 中处理。

即将进行的增强

  • 谓词下推
    • 值范围
    • 值正则表达式
    • 时间戳范围
  • 多线程
  • 分区感知执行
  • 生产就绪

如何安装

将以下内容添加到您 DataFusion 的 Rust 项目中的 Cargo.toml 文件中。

datafusion-bigtable = "0.1.0"

DataFusion-HDFS

这个 crate 引入了 HadoopFileSystem 作为远程 ObjectStore,它提供了查询 HDFS 文件的能力。对于 HDFS 访问,使用了 fs-hdfs 库。

DataFusion-Tokomak

这个 crate 提供了一个基于 e-graph 的 DataFusion 优化框架,该框架基于 Rust egg 库。e-graph 是一种支持等式饱和优化技术的数据结构。

作为背景,DataFusion 中的优化器框架目前正在 审查中,目标是实施一个更具战略意义的长期解决方案,该解决方案更高效且更易于开发。

在 DataFusion 中使用 egg 的一些好处是

  • 实现手动编写的优化通道难以匹敌的优化算法
  • 使添加优化规则更容易且更简洁
  • 插件框架,可添加更复杂的优化
  • Egg 不依赖于规则顺序,并且可以通过同时应用多个规则直到收敛来实现更高级别的优化
  • 允许基于成本的优化

这是 DataFusion 一个激动人心的新领域,有很多社区参与的机会!

DataFusion-Tui

DataFusion-tui 也称为 dft,它提供了一个功能丰富的终端应用程序,用于使用 DataFusion。它从 datafusion-cli 中汲取了灵感和一些功能。与 datafusion-cli 相比,此工具的目标是提供轻量级 SQL IDE 体验,用于使用 DataFusion 查询数据。这包括以下当前已实现的功能

  • 选项卡管理,提供 DataFusion 查询、结果、ExecutionContext 信息和日志的清晰结构化组织
    • SQL 编辑器
      • 用于编写 SQL 查询的文本编辑器
    • 查询历史记录
      • 已执行查询的历史记录、它们的执行时间和返回的行数
    • ExecutionContext 信息
      • 公开有关使用了哪些物理优化器以及设置了哪些 ExecutionConfig 设置的信息
    • 日志
      • 来自 dft、DataFusion 和任何依赖库的日志
  • 支持自定义 ObjectStore
    • S3
  • ~/.datafusionrc 预加载 DDL,以便在启动时可以使用本地“数据库”

即将进行的增强

  • SQL 编辑器
    • 将查询结果写入文件的命令
    • 多个 SQL 编辑器选项卡
  • 公开来自 ExecutionContext 的更多信息
  • 提供有关函数信息的帮助选项卡
  • 查询自定义 TableProvider,例如 DeltaTableBigTable

DataFusion-Streams

DataFusion-Stream 是一个新的测试平台,用于在 DataFusion 中创建 StreamProvider,这将支持查询流数据源,例如 Apache Kafka。此功能的实现目前正在设计中,并且正在积极审查中。设计完成后,trait 和附属数据结构将被添加回核心 DataFusion crate。

DataFusion-Java

这个 项目 创建了一组 DataFusion 的初始 Java 绑定。该项目目前处于维护模式,正在寻找维护人员来推动未来的发展。

如何参与

如果您有兴趣为 DataFusion 做贡献,并了解最先进的查询处理,我们非常欢迎您加入我们的旅程!您可以通过在您自己的数据和项目上试用 DataFusion 并让我们知道它的运行情况,或者贡献包含文档、测试或代码的 PR 来提供帮助。适合初学者的未解决问题列表 在这里

了解如何在 DataFusion-Contrib 中创建新扩展的最佳方法是在 Apache 软件基金会 Slack 工作区的 #arrow-rust 频道上联系我们。

您还可以查看我们新的沟通文档,了解与社区互动的更多方式。

如果您想为 DataFusion-Contrib 代码库做出贡献,我们已在上方提供了每个代码库的链接。