Hive 有人能给我解释一下蜂巢(0.13)的以下行为吗?

Hive 有人能给我解释一下蜂巢(0.13)的以下行为吗?,hive,decimal,precision,Hive,Decimal,Precision,为什么使用十进制会破坏精度? 使用更高精度的十进制或将查询的所有成员转换为十进制是没有帮助的,结果只能保持8位精度。当处理浮点数时,计算机必须在速度和精度之间找到折衷办法。这在处理非常小或非常大的浮点数时尤为明显 存在一个错误,因此在某种程度上,错误是“标准化”的 下面是一个比较多种语言的有趣示例: 当您告诉程序不要将某个数字视为浮点数,而是将其视为十进制时,结果会发生变化,因为它不再符合标准。在案例1中,hive返回double,因此您会看到一个非常大的精度。十进制类型的范围约为-10^-30

为什么使用十进制会破坏精度?
使用更高精度的十进制或将查询的所有成员转换为十进制是没有帮助的,结果只能保持8位精度。

当处理浮点数时,计算机必须在速度和精度之间找到折衷办法。这在处理非常小或非常大的浮点数时尤为明显

存在一个错误,因此在某种程度上,错误是“标准化”的

下面是一个比较多种语言的有趣示例:


当您告诉程序不要将某个数字视为浮点数,而是将其视为十进制时,结果会发生变化,因为它不再符合标准。

在案例1中,hive返回double,因此您会看到一个非常大的精度。十进制类型的范围约为-10^-308到10^-308

select 52 * 20 / 6700000 ;
=0.00015522388059701492  
select cast(52 as decimal(2,0)) * 20 / 6700000;
=0.00015522
在案例2中,hive返回十进制数(12,8),因此您可以看到这样的结果

select 52 * 20 / 6700000 ;
Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:_c0, type:double, comment:null)], properties:null)

为什么??我不是100%确定,但我认为在案例1中,配置单元试图返回默认数据类型,但在案例2中,因为我们使用的是cast decimal,所以它试图返回十进制(12,8)。我运行了SQLs并捕获了内部日志以显示返回数据类型。

有趣的文章,但遗憾的是,没有一篇文章给出了这个问题的答案:decimal()不应该以这种方式工作,但显然它是这样的。所以问题依然存在:有人知道为什么吗?有人在蜂巢0.13中遇到同样的问题吗?
select cast(52 as decimal(2,0)) * 20 / 6700000; 
Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:_c0, type:decimal(12,8), comment:null)], properties:null)