hadoop - hive - double

标签 hadoop hive

我一直在研究 hive ,发现了一些奇怪的东西。基本上,当使用 double 作为列的数据类型时,我们不需要指定任何精度(hive 根据值动态获取精度)。但是,问题来了。每当我的值是小数点后的 2 和 7 时,我看到返回值也会改变精度的位数。

让我用我的简单示例来阐明这一点。

hive> select cast('34.2234' + '32.6554' -3.1 as double);
OK
63.7788
Time Taken 0.077 seconds, Fetched: 1 row(s)

当我在小数点后使用 1(减法时 3.1 中的 1)时,我可以看到结果似乎不错。但是当减去 3.2 或 3.7 时,我看到以下变化

使用 3.2 时

hive> select cast('34.2234' + '32.6554' -3.2 as double);
OK
63.678799999999995
Time Taken 0.077 seconds, Fetched: 1 row(s)

使用 3.7 时

hive> select cast('34.2234' + '32.6554' -3.7 as double);
OK
63.178799999999995
Time Taken 0.077 seconds, Fetched: 1 row(s)

虽然结果看起来是正确的,但为什么在这种情况下精度会发生变化。当我们在小数点前使用任何值而在小数点后仅使用 2 或 7(如 4.2、4.7、3.2、2.7 等)时,情况是一样的。 2 和 7 有什么特别之处,它会将精度更改为 15 个值,为什么不更改为其他值。

最佳答案

这是浮点运算的样子

hive> select 1.1 + 0.1;
OK
1.2000000000000002

DOUBLE (8-byte double precision floating point number

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

如果您想要准确/可预测的东西,请使用 decimal

hive>  select cast (1.1 as decimal(12,2)) + cast (0.1 as decimal(12,2));
OK
1.2

关于hadoop - hive - double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43362996/

相关文章:

hive - 我们可以在同一个查询中同时拥有静态和动态分区吗?如果是,那么将如何创建文件夹。?

r - R 如何使用 RJDBC 连接到 Hive?

hadoop - 一起使用 Hadoop Partitioner 和 Comparator 类

java - HBase 分区域负载均衡

hadoop - 在 Hadoop 中使用流式处理

hadoop - 在Hive UDF中记录消息

hadoop - 如何使用与客户端进程不同的所有者创建 HDFS 文件

sql - 如何在具有不同分隔符的HIVE中处理SPLIT功能

hadoop - 多列的百分位数

hadoop - 在 Hive 中启动 MapReduce 作业的标准