2017-03-07 1 views
0

Apache Spark 2.0.2를 사용하면 약 2300 만 개의 행과 약 300 개의 열을 포함하는 쪽모이 한 테이블이 있습니다. 큰 숫자의 오류 agregattion

select sum(total_price) from my_table; 

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

그래서이 숫자 9.3923769592 E 8 잘못 : 나는 실행하면 나는 두 번으로 저장 TOTAL_PRICE 라는 열이. 내가 실행하면

하지만 :

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 대략 ~ 939,237,695이며, 더 많거나 적은 당신이 올해 집계 된 숫자에 따라 기대. 당신은 몇 가지 숫자는 포인트를 arithmetics 일반적으로 사용되는 유형의 부동 사용하여 표현할 수 있음을 기억해야 얻을 수있는 값에 대해서는

, 스칼라 Double 또는 Float 같이, (예를 들어 회계) 정확한 값이 필요한 사용 사례에 적합하지 않습니다 . 이와 같은 응용 프로그램의 경우 DecimalType을 사용해야합니다.

읽기를 권하고 싶습니다. What Every Computer Scientist Should Know About Floating-Point ArithmeticIs floating point math broken?