【问题标题】:Hive table query giving incorrect result for sum functionHive 表查询为 sum 函数提供不正确的结果
【发布时间】: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


【解决方案1】:

试试这个:

select id, SUM(CAST(Amount AS DECIMAL(9,2))) sum from table1 group by id;

如果这不起作用,请尝试将列数据类型从 double 更改为 decimal,确保添加精度和小数位数,即 amount decimal(9,2)

参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-DecimalsdecimalDecimals

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多