赞
踩
公司数据库部分产品基于Hive进行开发,其中出现一个Bug。Oracle中表t1有个字段类型为decimal(38,0),当Hive这边执行了select Floor(col) from dblink,显示 Floor函数计算的精度太大。但是select Floor(col) from oracle_table 在Oracle这边本身就可以执行,而且Floor的意思是取小于等于的最大整数。
首先介绍一下精度问题:precision和scale
Hive源码中的思路如下:
(1)首先在GenericUDFFloorCeilBase类中重新计算精度,precision=precision-scale+1
(2)其次在HiveDecimalUtils类中实例化decimal时,会验证precision和scale是否合法
但是这里忽略了致命的问题,因为HiveDecimal.MAX_PRECISION=38,当我定义一个列col类型decimal(38,0),真实数据为1。那么执行select Floor(col) from hive_table,真实数据应该为1,但这里会报错。因为GenericUDFFloorCeilBase重新计算precision=38-0+1=39,在validateParameter中会判断39>HiveDecimal.MAX_PRECISION从而报错
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。