使用 Acero 和 Substrait#
为了使用 Acero,您需要创建一个执行计划。该模型描述了要应用于数据的计算。Acero 有其自己的执行计划内部表示形式,但大多数用户不应该直接与之交互,因为它会将他们的代码耦合到 Acero。
Substrait 是一个用于执行计划的开放标准。Acero 实现了 Substrait“消费者”接口。这意味着 Acero 可以接受 Substrait 计划并执行该计划,加载请求的数据并应用所需的计算。通过使用 Substrait 计划,用户可以轻松地在以后切换到不同的执行引擎。
Substrait 一致性#
Substrait 为许多不同情况定义了一组广泛的运算符和函数,Acero 不太可能完全满足所有定义的 Substrait 运算符和函数。为了帮助理解哪些功能可用,以下部分定义了 Acero 中当前已实现的功能以及适用的任何注意事项。
计划#
一个计划应该有一个单一的顶级关系。
当前消费者基于 Substrait 0.20.0 版本。任何更新版本添加的功能都将不受支持。
由于 0.20.0 中的重大更改,任何早于 0.20.0 的 Substrait 计划都将被拒绝。
扩展#
如果计划包含任何扩展类型变体,它将被拒绝。
可以通过提供
arrow::engine::ExtensionProvider
的自定义实现来提供高级扩展。
关系(一般)#
任何未在下面明确列出的关系都将不受支持,并将导致计划被拒绝。
读取关系#
projection
属性不受支持,包含此属性的计划将被拒绝。VirtualTable
和ExtensionTable
读取类型不受支持。包含这些类型的计划将被拒绝。目前仅支持 parquet 和 arrow 文件格式。
所有 URI 必须使用
file
方案。partition_index
、start
和length
不受支持。包含这些属性的非默认值的计划将被拒绝。Substrait 规范要求读取关系必须完全满足
filter
。但是,Acero 仅将读取过滤器用于下推投影,并且它可能不会完全满足。用户通常应在读取关系之后附加一个具有相同过滤表达式的附加过滤关系。
过滤关系#
没有已知的注意事项。
投影关系#
没有已知的注意事项。
连接关系#
连接类型
JOIN_TYPE_SINGLE
不受支持,包含此类型的计划将被拒绝。连接表达式必须是对
equal
或is_not_distinct_from
函数的调用。调用的两个参数必须是直接引用。仅支持单个连接键。post_join_filter
属性不受支持,将被忽略。
聚合关系#
最多支持一个分组集。
每个分组表达式必须是直接引用。
每个度量的参数必须是直接引用。
度量不能有过滤器。
度量不能有排序。
度量的调用必须是 AGGREGATION_INVOCATION_ALL 或 AGGREGATION_INVOCATION_UNSPECIFIED。
度量的阶段必须是 AGGREGATION_PHASE_INITIAL_TO_RESULT。
表达式(一般)#
Substrait 规范中的各个位置允许在过滤器或投影关系之外使用表达式。例如,连接表达式或聚合分组集。Acero 通常希望这些表达式是直接引用。规划器应在将计划交付给 Acero 之前将隐式投影提取到正式的投影关系中。
字面量#
具有非默认可空性的字面量将导致计划被拒绝。
类型#
Acero 不完全支持不可为空的类型,并且可能允许输入具有空值而不拒绝它。
下表显示了当前支持的 Arrow 类型和 Substrait 类型类之间的映射。
Substrait 类型 |
Arrow 类型 |
注意事项 |
---|---|---|
boolean |
boolean |
|
bool |
i8 |
|
int8 |
i16 |
|
int16 |
i32 |
|
int32 |
i64 |
|
int64 |
fp32 |
|
float32 |
fp64 |
|
float64 |
float64 |
|
string |
string |
|
binary |
binary |
|
timestamp |
timestamp<MICRO,””> |
|
timestamp_tz |
timestamp<MICRO,”UTC”> |
|
date |
date32<DAY> |
|
time |
time64<MICRO> |
|
interval_year |
time64<MICRO> |
|
目前不支持 |
time64<MICRO> |
|
interval_day |
time64<MICRO> |
|
目前不支持 |
time64<MICRO> |
|
uuid |
uuid |
|
FIXEDCHAR<L> |
fixed_size_binary<L> |
|
VARCHAR<L> |
utf8 |
FIXEDBINARY<L> |
fixed_size_binary<L> |
time64<MICRO> |
|
DECIMAL<P,S> |
decimal128<P,S> |
|
STRUCT<T1…TN> |
struct<T1…TN> |
Arrow 结构字段将没有名称(空字符串) |
NSTRUCT<N:T1…N:Tn>
struct<N:T1…N:Tn>
LIST<T>
list<T>
MAP<K,V>
map<K,V>
K 必须不可为空