最近发现通过sqoop将oracle数据库当中的数据到如到hive当中,发现oracle数据库当中number类型的数据变成了hive当中的double类型。不只是变成了double类型,数据好像稍微有点变化。
比如原来的:3769.14 变成了 3769.1399999999999 ,还有就是1737.66 变成了1737.6600000000001 貌似有点数据变小了,有的数据变大了
这个是什么原因那,
产生如上结果原因为:
a) 对于所有使用IEEE标准进行浮点编码系统中,都普遍存在如下问题,并不仅仅是hive,Java,还有很多
b)hive当中double是8个字节。比如0.2对饮的真实结果是0.200000000001
c) 顺便说一下 hive当中的float类型是占4个字节,比如0.2对应的是0.2000001
所以在进行数据类型比较的时候,特别是hive当中,如果大于某个数,其实这个时候指的就是double的数据类型。
综上所以在将数据导入到hive之后的精度发生了变化。所以我们要将hive当中的数据类型和oracle数据库当中的数据类型对应起来。这样在导入数据的时候才不会出现数据精度发生变化的情况。