java—在配置单元中将字符串隐式转换为int时会发生什么?

2ic8powd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(466)

当我使用配置单元查询数据时遇到了以下这种情况: select '6455983054544699410' = 6455983054544699395 ===> true 所以我想知道在配置单元中将字符串隐式转换为int时会发生什么?
谢谢。

gojuced7

gojuced71#

双方都要加倍努力

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.");
      }

相关问题