4个版本

0.2.1 2024年4月8日
0.2.0 2024年1月24日
0.1.1 2024年1月13日
0.1.0 2024年1月9日

#1852数据库接口

Download history 44/week @ 2024-05-03 140/week @ 2024-05-10 196/week @ 2024-05-17 126/week @ 2024-05-24 169/week @ 2024-05-31 115/week @ 2024-06-07 195/week @ 2024-06-14 215/week @ 2024-06-21 102/week @ 2024-06-28 107/week @ 2024-07-05 187/week @ 2024-07-12 231/week @ 2024-07-19 336/week @ 2024-07-26 240/week @ 2024-08-02 151/week @ 2024-08-09 165/week @ 2024-08-16

918 每月下载量
lance-datafusion 中使用

Apache-2.0

115KB
2.5K SLoC

Substrait表达式

此项目旨在简化Substrait表达式对象的工作。

目前,它仅是一个Rust库。但是,我希望能够尽快添加Python绑定。有关更多信息,请参阅Crate文档。


lib.rs:

Substrait表达式

此Crate提供了用于处理Substrait表达式的实用工具。Substrait是一个关系代数计划的平台无关规范(通常称为查询计划)。表达式是查询计划的一部分,通常在过滤和投影中找到。然而,表达式可以在查询计划之外单独使用。

提供的内容

  • 提供了一个表达式构建器,可以轻松地以编程方式创建表达式
  • 辅助函数使得获取表达式部分信息变得容易
  • (待办事项) 转换到/从其他Rust库的实用工具
  • (待办事项) 一个SQL解析器允许您从SQL字符串创建表达式

谁应该使用此库

此库的常见用例包括

  • 尝试为其自己的库创建Substrait绑定的用户,例如将Substrait的表达式映射到库的内部表达式概念。
  • 需要使用多个查询库并希望有一个共同起点的用户。
  • 发现他们使用的库支持Substrait但没有他们想要的全部表达式构建功能的用户。

否则,如果您正在愉快地使用polars或datafusion之类的库,这些库有自己的表达式概念,您可能不会从这个库中获得太多好处(也许只是不同的API)

表达式概述

本节提供了核心概念的概述,并假设您对Substrait有基本的了解。如果您只需要了解如何使用此库,则可以跳过本节,并查看上面提到的部分之一。

什么是表达式?

表达式是描述如何计算值的编程语句。它们通常用于描述过滤器、基于输入计算新列或选择输入值的一部分。以下都是表达式(以SQL表示)

x
x + 3
x < 7 OR x > 50
x + y.z

模式

模式实际上不是表达式的一部分,但在Substrait中,它通常伴随着表达式。模式描述了关于输入数据的已知信息。例如,当我们查询数据库中的表时,该表通常有一个模式,描述了每列的名称和数据类型。

模式解析

应用程序的不同部分通常知道不同数量的模式信息。

模式对输入数据一无所知。我们不知道有多少字段,它们的名称是什么,或者数据类型是什么。空模式将产生一个松散表达式。其他系统有时将这些表达式称为未解析未绑定表达式。

对松散表达式能做的事情不多。它们不能被优化、验证或执行。然而,它们通常在应用程序早期转换为Substrait时很有用。例如,一个应用程序可能解析边缘的SQL查询/语句,需要将这些语句发送到数据服务器,在那里将在目录中查找模式。到那时,表达式可以绑定到模式以创建只包含类型或完整的模式。

仅名称模式描述了输入列的名称,但没有描述它们的类型。这在实践中相当不常见,对这些模式的支持主要是为了完整性。

仅类型模式描述了输入列的类型,但没有描述它们的名称。这是非常常见的。了解字段类型就足够进行验证、优化和执行。Substrait的核心是针对仅类型系统设计的。用户有时会发现只处理类型而丢弃名称很奇怪。然而,一旦计划开始优化,名称的意义就变得较小。例如,一个表达式可能被重构为几个常见的表达式,而这些常见的表达式可能没有有意义的名称。

完整模式描述了所有输入列的类型和名称。这也是非常常见的,尤其是在接近用户的组件中。知道名称与类型相比的主要优点是使计划更易于阅读和调试。

这个库旨在支持所有四种类型的模式/计划。在构建模块中有构建模式和类型的实用程序。在辅助模块中有处理模式和类型的辅助方法。

抽象语法树(AST)

表达式本身是一个由三种不同类型的节点组成的抽象语法树,包括函数调用、字段引用和文字。字段引用可以引用模式,也可以引用先前表达式的返回值(通常用于选择复杂返回值的一部分)。在构建模块中可以找到构建所有三种类型节点的实用程序。

Substrait 扩展

为了支持尽可能多的场景,这个库与一些Substrait扩展一起工作。

未知类型

表达式AST中的所有节点都有类型。当模式没有类型信息时,由该模式创建的字段引用将具有未知类型。这是一种特殊类型,可以在函数调用中替换任何其他类型,将函数调用的返回类型更改为未知类型。例如,add(int32, unknown)将是一个有效的函数调用,并返回未知

名称查找(待办事项)

有时用户会按名称请求字段。例如,表达式 x + y 指代字段 xy。如果我们架构不了解名称,则无法执行此查找。如果启用名称查找,则这些字段引用将转换为特殊的“名称查找”AST节点。这的行为就像字段是未知类型的字段引用。

名称注解(待办事项)

Substrait 中的 AST 节点没有名称。一些表达式库支持命名 AST 节点。例如,一个 SQL 查询包含 x + y AS foo。在这里,foo 是一个函数调用节点的名称。我们的目标是能够在不丢失该名称信息的情况下来回执行此计划。我们通过将名称注解附加到 AST 节点来实现这一点。

依赖关系

~1.3–4.5MB
~77K SLoC