【发布时间】:2018-04-11 18:25:20
【问题描述】:
有一个蜂巢表,其中包含如下数据。
select * from table1;
id Amount
1 8.50
1 -8.50
2 3.05
查询数据如下。 SUM 未返回 0 的预期输出。
select id, sum(amount) as sum from table1 group by id;
id sum
1 -9.026113190202523E-14
2 3.05
ID 是 BIGINT 类型。 金额类型:双精度,列大小:15,小数位数:15
即使这是由于金额列的高精度,为什么它会返回非零值。我也检查了这个表的插入脚本。 INSERT 发生在金额列上只有两位小数。奇怪的是,如果我将数据导出到 excel,并且只有当我在 excel 中再次对数据进行排序时,总和才会显示为零。没有排序,总和在 excel 中显示出类似的科学价值。
表在 AWS HDFS 上,我正在使用 Hive 连接到它。
【问题讨论】:
-
这只是一个表示 - 检查这个:
0.0000000000001 > 9.026113190202523E-14- 这将返回True。 -
对。但这有点在更大的范围内暴露了很多错误。在嵌套选择中在此 sum 函数之上进行大量计算。在一种情况下,我对非零值进行过滤,将其加入不同的流数据集并导出。这导致大约 80K 不正确的值奇怪地出现在数据提取上。有很多这样的报告/摘录。
-
好吧,这就是计算机处理浮点数/双精度数的方式。用你最喜欢的编程语言检查这个:
0.1 + 0.2 == 0.3- 你可能会感到惊讶;-) 通常0.1 + 0.2返回0.30000000000000004,它不等于0.3,但非常非常接近它 -
我可以更改什么以及在哪里为我的计算提供准确的答案?系统设置等。它是否在任何地方定义了 Hive 中的 SUM 应该如何工作?
-
这取决于您的数据和您的需求...
amount是什么?rounding会是您的选择吗?如果它代表“金钱”,那么我建议像所有银行家一样以美分(以您的货币)整数来计算和存储所有内容。
标签: amazon-web-services apache-spark hive hdfs