大数字agregattion出错

时间:2017-03-07 15:18:30

标签: apache-spark double

使用Apache Spark 2.0.2我有一个存储为镶木地板的表,其中包含大约2300万行和大约300列。我有一个名为 total_price 的列存储为double,如果我执行:

select sum(total_price) from my_table;

+-----------------+
|   total_price   |
+-----------------+
|   9.3923769592E8|
+-----------------+

所以这个号码为9.3923769592 E 8错了。

但如果我执行:

select year, sum(total_price) from my_table;

+-------+------------------------+
|   year|             total_price|
+-------+------------------------+
|   2017|  44510982.10004025     |
|   2016| 293320440.63992333     |
|   2015| 311512575.890131       |
|   2014| 289885757.2799143      |
|   2013|      5192.319          |
|   2012|      2747.7000000000007|
+-------+------------------------+

我的假设是在第一个查询中,double数据类型有溢出或类似的东西。

  • 为什么我在点后面得到如此多的小数结果,如果它们存储为#。##?

  • 如何修复第一个查询的错误?

1 个答案:

答案 0 :(得分:0)

你得到的价值看起来很好 - 9.3923769592E8大致约为939,237,695,并且基于按年汇总的数字或多或少的预期值。

关于您获得的值,您必须记住,只有一些数字可以使用浮点算术表示,而常用的类型(如Scala DoubleFloat)不适用于精确值的用例是必要的(例如)。对于这样的应用程序,您应该使用DecimalType

我还建议您阅读What Every Computer Scientist Should Know About Floating-Point ArithmeticIs floating point math broken?