decimal精度_Hive和Imapla查询decimal类型结果不同异常

本文详细描述了一个关于Hive和Impala在处理decimal类型数据时出现精度不匹配的问题,Hive在查询时损失精度,而Impala则直接返回空。分析指出,这是由于原始数据精度超过字段设定精度导致的。为解决此问题,提出了通过变更字段类型(如转为string)来修正数据的方案,并强调在建表时应根据数据精度设定合适的decimal类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​异常重现

1.当前集群HDFS上/tmp/newfile目录下存在文件hive.txt

[root@cdp4 ~]# mkdir /data/ZK[root@cdp4 ~]# 
11f71d55e4ab7a0c8d8bd458d30c25e5.png

2.从Hue中创建一个hive表test如下

create external table test (s1 string,s2 decimal(13,2)) row format delimited fields terminated by '#' stored as textfile location '/tmp/newfile'    
0dd527e2bb1052d4d0284996f10d1830.png

3.在Hive中进行查询,可以看到结果如下图。

select * from test
3b643943cb43bfc279e115e955e78b40.png

4.在Impala中进行查询,可以看到s2列全部为空

3d16ce585047502b3d489e87f135c2c8.png

同样的表,在Hive和Impala中分别进行查询,结果不同,异常得以重现。

异常分析

根据异常重现部分的步骤,S2字段的数据类型是decimal(13,2)。精度只有2位,但是我们原始数据小数点后都是有3位小数。Hive在这里进行查询的时候会损失精度,打印结果。但是Impala在查询的时候,校验decimal类型会更严格,当前的原始数据精度超过了S2字段设定的数据类型的精度,所以直接返回为空。

异常解决

根据上面的分析,是由于数据的精度超过了S2字段的设定,这里可以通过改变字段类型来进行解决。

1.在Hue中执行下面的SQL进行字段类型的变更

ALTER TABLE test CHANGE s2 s2 string
849051802808e7e98cb4ba547b2e6dae.png

2.再次进行查询,可以看到Impala中可以查到数据了,并且可以看到S2字段的数据类型已经变成了string

279036766d4703bfb9a8c94c5b362a2d.png

3.由于数据类型变了,我们再从hive中查询,可以看到,查询结果也变化了,跟Impala中的查询结果一致。

83504791a62c0d293b09fa2ea7646dda.png

总结

1.在Hive和Impala同时间遇到精度不匹配的情况的时候,Hive会通过损失精度来输出结果,同样的情况,Impala则会直接返回NULL。

2.在建表的时候,如果涉及到decimal数据类型,我们需要根据原始数据的精度,来设计好相关的参数,避免出现精度丢失的情况。

3.如果由于历史原因,当前的表中已经出现精度丢失,我们可以通过转换数据类型,来进行处理。可以先转换成string类型,进行查询。后面也可以根据表的数据范围,再修改成其他精度匹配的数据类型,进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值