首页 > 其他分享 >SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查

时间:2022-10-30 10:08:21浏览次数:90  
标签:SET FALSE DECIMAL hive 报错 SQL decimal select


概述

最近在全职负责一款数据产品的升级改造。因旧版平台的代码写得太乱,简直惨不忍睹;别说增加功能,已有问题的定位与修复都无从下手。用户提交的,在旧版平台能执行的SQL语句,在新版平台执行报错。

此为背景。

UDF ERROR: Cannot divide decimal by zero

报错信息如下:​​java.lang.RuntimeException: UDF ERROR: Cannot divide decimal by zero\n​​。

问题很明显,就是select查询语句里面含有​​/​​符号,并且分母为0。

这个报错,在不同的数据集任务,即至少两个SQL中都有出现;且在旧版平台都是执行成功的。

Impala数据源

报错的SQL精简如下:

select name as 城市
,dt as 日期
,sum(price_11) as 补单已支付金额
,sum(price_10) as 补单未支付金额
,sum(price_11)/(sum(price_11) + sum(price_10)) as 补单回款率
from t group by name, dt

报错SQL是impala数据源:

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查_hive


在公司内部搭建可视化查询平台执行成功,执行结果截图

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查_hive_02


下面这个截图是尝试复现问题的SQL,当分母为​​0.0​​​时,就会出现​​UDF ERROR: Cannot divide decimal by zero​​问题。

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查_sql_03

kudu数据源

另有SQL,相同的报错:

select c.*, c.cost/youe_count as cpcredit,
c.cost/all_youe_count as cpallcredit, c.cost/all_youe_amount as fyl
from b left join c on b.touch_date = c.dt

其数据源为:

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查_hive_04


在可视化查询平台执行失败,在旧版程序能够成功,

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查_sql_05


经过排查,和使用的​​hive-jdbc​​​依赖组件无关。旧版平台使用的​​hive-jdbc​​版本为:

<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.1.0-cdh5.7.1</version>
</dependency>

新版平台使用的hive-jdbc版本为​​2.1.1-cdh6.2.1​​:

而是在提交hive类SQL(impala和kudu都是基于hive)之前未执行语句:​​SET DECIMAL_V2=FALSE​​:

// 解决换新集群 select 1/0.0 报错
if ("org.apache.hive.jdbc.HiveDriver".equals(driver)) {
ps.executeUpdate("SET DECIMAL_V2=FALSE");
}

RuntimeException: AnalysisException: Incompatible return types ‘DECIMAL(38,15)’ and ‘DECIMAL(38,4)’ of exprs ‘’ and ‘’

另有一个SQL报错信息:

java.lang.RuntimeException: AnalysisException: Incompatible return types 'DECIMAL(38,15)' and 'DECIMAL(38,4)' of exprs 'edw.insure_policy.commission_rate' and 'project_b.insure_policy_test.commission_rate'.

报错SQL如下:

select * from edw_bx.insure_policy union all select * from project_b.insure_policy_test

这个报错会出现在​​select a from b union all select a from c​​,且当b表和c表的a字段的类型不同时。

UDF ERROR: Decimal expression overflowed

报错SQL简化如下:

select 
to_date(now()) as batchId
,cast(gmv as decimal(38, 5)) as gmv
from xyg.wf_counter_MRR_month_220517_01 a
where a.mon = '2022-04';

这个报错会出现在​​cast(a as decimal(38, 5)) as a​​时,本地复现此问题的SQL如下:

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查_hive_06

UDF ERROR: String to Decimal parse failed

本地复现此问题的SQL如下:

SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查_旧版_07

SET DECIMAL_V2=FALSE

参考​​DECIMAL_V2 Query Option​

A query option that changes behavior related to the DECIMAL data type.
Important:
This query option is currently unsupported. Its precise behavior is currently undefined and might change in the future.
Type: Boolean; recognized values are 1 and 0, or true and false; any other value interpreted as false
Default: false (shown as 0 in output of SET statement)

参考

​Query Options for the SET Statement​​​​DECIMAL_V2 Query Option​

CDH6中Impala3报错UDF ERROR: String to Decimal parse failed
​​​impala-cast-as-decimal-errors-out-for-null-values​



标签:SET,FALSE,DECIMAL,hive,报错,SQL,decimal,select
From: https://blog.51cto.com/u_15851118/5807183

相关文章

  • JAVA___HashSet底层原理
    HashCode和equalsHashSet通过hashCode确定元素存储的位置,如果该位置没有元素就直接放入,有元素的话需要利用equals方法比较两个元素是否相同,如果不相同利用链表将两个元素......
  • 63-ES11-Promise_allSettled方法
     ......
  • 利用 ipset 封禁大量 IP
    1. 简介使用iptables封IP,是一种比较简单的应对网络攻击的方式,也算是比较常见。有时候可能会封禁成千上万个IP,如果添加成千上万条规则,在一台注重性能的服务器或者本身性......
  • 上手Python之set(集合)
    为什么使用集合我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景。为何又需要学习新的集合类型呢?通过特性来分析:列表可修改、支持重复元素且......
  • react中的setState是同步还是异步?react为什么要将其设计成异步?
    壹❀引了解react的同学都知道,react遵守渲染公式UI=Render(state),状态决定了组件UI最终渲染的样子(props也可以理解为外部传入的状态),由此可见state对于react的重要性。而......
  • 【整理】Linux:set -eux
    背景我们经常见到很多设立了脚本打头会写如下set-e或者set-ex或者set-eux这是什么意思呢?具体解释一下Linuxset命令用于设置shell。set指令能设置所使用shel......
  • ES6 WeakSet
    WeakSet类似WeakMap,weak表示弱映射,value(弱弱地拿着)而且必须是对象,意思是key不是正式引用,不会阻止垃圾回收,但只要key存在就不会被垃圾回收机制销毁。 操作......
  • Django ORM-QuerySet Part
    主题一:什么情况下会触发QuerySet计算查询集Queryset可以生成、过滤、切片、传递,这些行为都不会引起数据库的操作,除非执行以下操作对查询集进行计算。(1)迭代:Queryset是可以......
  • 问:React的useState和setState到底是同步还是异步呢?
    先来思考一个老生常谈的问题,setState是同步还是异步?再深入思考一下,useState是同步还是异步呢?我们来写几个demo试验一下。先看useState同步和异步情况下,连续执行两......
  • JDBC-ResultSet基本使用
    ResultSet:结果集对象封装查询结果next():游标向下移动一行判断当前行是否是最后一行末尾(是否有数据)如果是则返回false如果不是则放回truegetxxx(参数):获取数据......