温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

发布时间:2021-12-09 15:53:24 来源:亿速云 阅读:348 作者:柒染 栏目:大数据

这期内容当中小编将会给大家带来有关Hive和Imapla查询decimal类型结果不同的异常该怎么解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

异常重现      

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

[root@cdp4 ~]# mkdir /data/ZK
[root@cdp4 ~]# 

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

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'    

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

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

select * from test

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

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

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

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

异常分析    

   

   

   

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

异常解决    

   

   

   

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

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

ALTER TABLE test CHANGE s2 s2 string

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

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

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

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

Hive和Imapla查询decimal类型结果不同的异常该怎么解决

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

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

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

上述就是小编为大家分享的Hive和Imapla查询decimal类型结果不同的异常该怎么解决了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI