---
title: 约束与限制
description: "在特性配置前，请先了解OmniOperator算子加速特性的使用限制。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/250RC1/bds/kunpengbds_omniruntime_20_0204.html
sourcePath: /source/zh/kunpengboostkithistory/250RC1/bds/kunpengbds_omniruntime_20_0204.html
indexId: 5fc96ea6dc8406e2c9e73568e2a31dc427071598f07602a62654efd41657351380
---
# 约束与限制

在特性配置前，请先了解OmniOperator算子加速特性的使用限制。

- 当前UDF插件仅支持Simple UDF，用于执行基于Hive UDF框架编写的UDF函数。
- 当前支持的Decimal数据类型规格包含64位和128位，如若超过128位的表示范围，则会抛出异常或者返回null，可能会导致和引擎开源版本行为不相同的情况，如SUM、AVG聚合等，若中间结果超出Decimal 128位，引擎开源版本正常执行，OmniOperator则根据配置抛出异常或者返回null。这里建议如果字段需要进行AVG运算且存在累加结果过大的可能，请使用Double等其他类型存储。
- 不同的负载所需内存配置不一样，例如TPC-DS 3TB数据集，SparkExtension推荐配置下，堆外内存配置不低于20GB，99条所有SQL可成功运行，运行过程中日志可能出现MEM_CAP_EXCEEDED但不影响最终功能，建议适当增大堆外内存配置。如果堆外内存配置过低，SQL执行结果可能不正确。
- 当前Sort、Window和HashAgg等算子支持Spill功能，BroadcastHashJoin、ShuffledHashJoin和SortMergeJoin等尚不支持Spill功能。
- Hive OmniOperator算子加速在成功执行TPC-DS 99条时，由于Hive开源版本在q14、q72和q89运行时可能存在问题，因此OmniOperator算子加速暂不支持Hive引擎运行这3条SQL。
- Hive OmniOperator算子加速在支持POWER表达式时，由于C++ std::pow函数和Java的Math.pow函数实现存在一些细微差异，导致使用C++实现的POWER表达式和Hive开源版本的POWER表达式存在一定误差，但相对精度误差不大于1e-15。
- Spark OmniOperator算子加速支持from_unixtime和unix_timestamp表达式：

  1. 仅支持时间解析策略spark.sql.legacy.timeParserPolicy为EXCEPTION、CORRECTED的情况，不支持LEGACY。
  2. 对于一些不合理的参数（如不存在的日期，无效的超大时间戳值等），Omni实现与Spark开源版本实现的处理结果存在不一致。
  3. 可以通过配置spark.omni.sql.columnar.unixTimeFunc.enabled=false来回退这两个函数，即使用Spark开源版本对应函数来规避    2
中的不一致问题。
- Hive OmniOperator算子加速在支持浮点数运算时，可能会产生和Hive开源版本行为不相同的场景，如除浮点数0.0等。若出现除浮点数0.0的场景，Hive开源版本返回null，OmniOperator算子加速则根据具体的运算行为返回Infinity、NaN或null。
- Hive引擎默认开启CBO优化，Hive OmniOperator算子加速当前仅支持开启CBO优化，不支持关闭，即不支持将hive.cbo.enable设置为false。
- 当SQL中存在Alter字段属性或使用LOAD DATA导入.parq数据的场景时，Hive引擎建议使用开源版本的TableScan算子。
- Spark OmniOperator算子加速同时对超多列进行表达式Codegen时，例如500列，编译开销大于OmniOperator加速效果，建议该场景采用Spark开源版本执行相关操作。
- OmniOperator算子加速目前不支持Spark 3.4.3和Spark 3.5.2的CHAR类型数据、AVG函数数据类型是Decimal128的情况，在执行过程中存在上述场景会导致算子回退。
- OmniOperator算子加速目前不支持Spark 3.4.3和Spark 3.5.2的ORC列式写入。
- OmniOperator算子加速支持Spark 3.5.2中的ROW_NUMBER和rank函数计算，面对dense_rank场景时会算子回退。
- 由于浮点数精度问题，OmniOperator算子加速在对Double类型的Sum和AVG操作可能会因执行顺序不同而产生不一致的结果。如果需要精确的结果，请考虑使用更高精度的数据类型（如Decimal）。
- Spark OmniOperator算子加速不支持Boolean类型数据比较运算符（<、<=、>、>=、!=、<>、=、==和<=>），同时不支持所有数据类型的比较运算符（<=>），在执行过程中存在这些场景会导致算子回退属于正常现象。如果在大表Join操作中发生回退，由于行列转换开销较大，可能导致性能下降。在实际使用中，建议尽量避免此类场景，以减少回退带来的性能影响。
  Hive OmniOperator算子加速在表声明的数据存储结构和实际存储结构不匹配，且GroupBy和分桶的参数一致时，Hive开源版本可能出现Group By算子分组异常的问题。因此建议在建表时不采用分桶策略或使用load data local inpath的方式导入数据，以保障表声明的存储结构和实际存储结构相匹配。 Hive OmniOperator算子加速在求和结果溢出时，可能会产生和引擎开源版本行为不相同的结果。OmniOperator算子加速返回NULL，使用户能够感知到运算发生溢出；Hive开源版本返回一个错误值，可能对用户造成误导。
