当在HIVE中将字符串隐式转换为int时会发生什么?

时间:2017-08-24 08:42:58

标签: java hadoop hive

当我使用hive查询数据遇到以下这种情况时:

select '6455983054544699410' = 6455983054544699395 ===> true

所以我想知道当字符串在hive中隐式转换为int时会发生什么?

感谢。

1 个答案:

答案 0 :(得分:1)

双方都被迫加倍

hive> select '6455983054544699410' =  6455983054544699395;
WARNING: Comparing a bigint and a string may result in a loss of precision.
OK
_c0
true
hive> select cast('6455983054544699410' as double) , cast (6455983054544699395 as double);
OK
_c0 _c1
6.4559830545446994E18   6.4559830545446994E18

https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc.java

// For now, if a bigint is going to be cast to a double throw an error or warning
      if ((oiTypeInfo0.equals(TypeInfoFactory.stringTypeInfo) && oiTypeInfo1.equals(TypeInfoFactory.longTypeInfo)) ||
          (oiTypeInfo0.equals(TypeInfoFactory.longTypeInfo) && oiTypeInfo1.equals(TypeInfoFactory.stringTypeInfo))) {
        String error = StrictChecks.checkTypeSafety(conf);
        if (error != null) throw new UDFArgumentException(error);
        console.printError("WARNING: Comparing a bigint and a string may result in a loss of precision.");
      } else if ((oiTypeInfo0.equals(TypeInfoFactory.doubleTypeInfo) && oiTypeInfo1.equals(TypeInfoFactory.longTypeInfo)) ||
          (oiTypeInfo0.equals(TypeInfoFactory.longTypeInfo) && oiTypeInfo1.equals(TypeInfoFactory.doubleTypeInfo))) {
        String error = StrictChecks.checkTypeSafety(conf);
        if (error != null) throw new UDFArgumentException(error);
        console.printError("WARNING: Comparing a bigint and a double may result in a loss of precision.");
      }