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 在 数据库接口
918 每月下载量
在 lance-datafusion 中使用
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
指代字段 x
和 y
。如果我们架构不了解名称,则无法执行此查找。如果启用名称查找,则这些字段引用将转换为特殊的“名称查找”AST节点。这的行为就像字段是未知类型的字段引用。
名称注解(待办事项)
Substrait 中的 AST 节点没有名称。一些表达式库支持命名 AST 节点。例如,一个 SQL 查询包含 x + y AS foo
。在这里,foo
是一个函数调用节点的名称。我们的目标是能够在不丢失该名称信息的情况下来回执行此计划。我们通过将名称注解附加到 AST 节点来实现这一点。
依赖关系
~1.3–4.5MB
~77K SLoC