2017-03-07 22 views
0

使用Apache Spark 2.0.2我有一個存儲爲parquet的表,其中包含大約23百萬行和大約300列。我有一個名爲TOTAL_PRICE存儲爲雙列,如果我執行:關於大數字聚集的錯誤

select sum(total_price) from my_table; 

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

因此這個數字9.3923769592 ê 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| 
+-------+------------------------+ 

我的假設是,在第一個查詢雙數據類型具有溢出或者類似的東西。

  • 爲什麼我得到的點後面有這麼多小數的結果如果它們存儲爲#。##?

  • 我該如何解決第一個查詢的錯誤?

回答

0

你看起來只有精細的價值 - 9.3923769592E8大致〜939237695,你基於逐年彙總的數字的期望或多或少。

至於你,你要記住,只有一些數字表示的使用浮點算術和常用類型的值,比如Scala DoubleFloat,是不適合使用情況的精確值是必要的(佔例如) 。對於像這樣的應用程序,您應該使用DecimalType

我也推薦閱讀What Every Computer Scientist Should Know About Floating-Point ArithmeticIs floating point math broken?