使用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数据类型有溢出或类似的东西。
为什么我在点后面得到如此多的小数结果,如果它们存储为#。##?
如何修复第一个查询的错误?
答案 0 :(得分:0)
你得到的价值看起来很好 - 9.3923769592E8大致约为939,237,695,并且基于按年汇总的数字或多或少的预期值。
关于您获得的值,您必须记住,只有一些数字可以使用浮点算术表示,而常用的类型(如Scala Double
或Float
)不适用于精确值的用例是必要的(例如)。对于这样的应用程序,您应该使用DecimalType
。
我还建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic和Is floating point math broken?