报错信息

HQL在查询语句中有中文时会有如下报错信息:

严重: org.apache.calcite.runtime.CalciteException: Failed to encode '数学' in character set 'ISO-8859-1'

(这里中文为“数学”字符)

出现原因

出现这种现象的原因一般是因为字符编码问题,默认编码是'ISO-8859-1', 这是一种单字节编码,中文会出现乱码情况,导致报错。

解决办法

解决办法有以下两种:

方法一:关闭基于CBO的查询优化

直接在hive客户端输入以下代码,并重新进行hql查询就不会再报错了

set hive.cbo.enable=false;

方法二:是直接指定字符编码,比如说指定用'UTF8'、'UTF16'等支持中文的编码

对于CBO的简单介绍:

  CBO的主要目标是通过检查查询中指定的表和条件来生成有效的执行计划,最终减少查询执行时间并降低资源利用率。解析后,查询将转换为代表查询必须执行的操作的逻辑树(抽象语法树),例如读取特定表或执行内部JOIN。提供各种优化方法,例如查询重写,JOIN重新排序,导出隐式谓词和JOIN消除,以生成逻辑上等效的计划。当前模型更倾向于使用密集计划,以实现最大并行度。每个逻辑计划都根据基于不同值的启发式方法的数量分配成本。

   Hive从0.14.0开始引入CBO(Cost-Based Optimizer),对HQL查询语句进行性能优化,在Hive 1.1.0之后,默认开启。HIVE使用Apache Calcite框架实现。