OmniOperator算子加速约束与限制
- 当前UDF插件仅支持Simple UDF,用于执行基于Hive UDF框架编写的UDF函数。
- 当前支持的Decimal数据类型规格包含64位和128位,如若超过128位的表示范围,则会抛出异常或者返回null,可能会产生和引擎原生行为不相同的场景,如SUM、AVG聚合等,若中间结果超出Decimal 128位,引擎原生正常执行,OmniOperator算子加速则根据配置抛出异常或者返回null。这里建议如果字段需要进行AVG运算且存在累加结果过大的可能,请使用Double等其他类型存储。
- 不同的负载所需内存配置不一样,例如TPC-DS 3TB数据集,SparkExtension推荐配置下,堆外内存配置不低于30GB,99条所有SQL可成功运行,运行过程中日志可能出现MEM_CAP_EXCEEDED但不影响最终功能,建议适当增大堆外内存配置。如果堆外内存配置过低,SQL有可能执行结果出错。
OmniMV物化视图不支持重写(或者提取物化视图)的场景规则
针对Spark引擎,OmniMV物化视图不支持重写或者提取物化视图的场景规则如表1所示。
针对ClickHouse引擎,OmniMV物化视图不支持重写或者提取物化视图的场景规则如表2所示
表1 Spark SQL引擎不支持重写或提取视图的场景规则场景
|
规则
|
说明
|
不支持重写
|
基本规则
|
- 查询需要的数据,视图无法满足,不支持重写。例如:查询:c1>=2,视图:c1>2,不支持重写。
- In、Like需要查询和视图条件完全匹配,不满足则不支持重写。例如:查询:in(2,3) ,视图: in(1,2,3),不支持重写。
- 查询SQL中已经使用了视图,不支持重写。
|
不支持重写
|
Join规则
|
- 只支持Inner-Join类型的重写,其他类型的Join在大部分场景下不支持重写。例如Outer-Join类型,只有当查询和视图完全一致时,才可以重写。
- 通过isValidPlan检查当前匹配的查询和视图的逻辑计划树是否满足最小单元的要求,只包含以下类型算子,不满足则不支持重写。
- LogicalRelation
- HiveTableRelation
- Project
- Filter
- Join
- SubqueryAlias
|
不支持重写
|
Aggregate规则
|
- 视图逻辑计划树根节点必须是Aggregate算子。像order by、having的根节点是Sort、Filter,这种视图不支持重写。
- 查询和视图逻辑计划树匹配,两边根节点都必须是Aggregate算子,然后会通过isValidPlan检查子树是否满足最小单元的要求,不满足则不支持重写。
- 查询中出现了视图中不存在的聚合函数,不支持重写。
- 查询group by字段是视图group by字段的子集,只支持对以下聚合函数(不带distinct,min/max除外)rollUp,不满足则不支持重写。
|
不支持提取视图
|
查询逻辑过于单一或者过于复杂
|
- 不支持从单表查询中提取物化视图。
- 查询中如果出现了多层嵌套子查询,只支持从最内层子查询中提取视图,而不支持从外层子查询提取物化视图。
- 不支持从含有临时表的子查询中提取物化视图。
|
表2 ClickHouse引擎不支持重写或者提取视图的场景规则场景
|
规则
|
说明
|
不支持重写
|
引擎定义的规则
|
- Where必须是PROJECTION定义中GROUP BY的子集。
- GROUP BY必须是PROJECTION定义中GROUP BY的子集。
- SELECT必须是PROJECTION定义中SELECT的子集。
- 匹配多个PROJECTION的时候,选取读取part最少的。
- 返回的数据行小于基表总数。
- 查询覆盖的分区part超过一半。
|
不支持提取视图
|
查询逻辑过于单一或者过于复杂
|
可以创建Projection的子查询必须是对单表的查询,即其FROM子句中只有一个表,且必须有group by子句,其余场景暂不支持提取Projection。
|