0794-5.16.2-Hive和Imapla查询decimal类型结果不同异常
时间:2022-07-23
本文章向大家介绍0794-5.16.2-Hive和Imapla查询decimal类型结果不同异常,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
异常重现
1.当前集群HDFS上/tmp/newfile目录下存在文件hive.txt
[root@cdp4 ~]# mkdir /data/ZK
[root@cdp4 ~]#
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'
3.在Hive中进行查询,可以看到结果如下图。
select * from test
4.在Impala中进行查询,可以看到s2列全部为空
同样的表,在Hive和Impala中分别进行查询,结果不同,异常得以重现。
异常分析
根据异常重现部分的步骤,S2字段的数据类型是decimal(13,2)。精度只有2位,但是我们原始数据小数点后都是有3位小数。Hive在这里进行查询的时候会损失精度,打印结果。但是Impala在查询的时候,校验decimal类型会更严格,当前的原始数据精度超过了S2字段设定的数据类型的精度,所以直接返回为空。
异常解决
根据上面的分析,是由于数据的精度超过了S2字段的设定,这里可以通过改变字段类型来进行解决。
1.在Hue中执行下面的SQL进行字段类型的变更
ALTER TABLE test CHANGE s2 s2 string
2.再次进行查询,可以看到Impala中可以查到数据了,并且可以看到S2字段的数据类型已经变成了string
3.由于数据类型变了,我们再从hive中查询,可以看到,查询结果也变化了,跟Impala中的查询结果一致。
总结
1.在Hive和Impala同时间遇到精度不匹配的情况的时候,Hive会通过损失精度来输出结果,同样的情况,Impala则会直接返回NULL。
2.在建表的时候,如果涉及到decimal数据类型,我们需要根据原始数据的精度,来设计好相关的参数,避免出现精度丢失的情况。
3.如果由于历史原因,当前的表中已经出现精度丢失,我们可以通过转换数据类型,来进行处理。可以先转换成string类型,进行查询。后面也可以根据表的数据范围,再修改成其他精度匹配的数据类型,进行处理。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法