복붙노트

[HADOOP] 하이브-배정도

HADOOP

하이브-배정도

나는 벌집에서 일하고 있고 독특한 것을 발견했습니다. 기본적으로 열의 데이터 유형으로 double을 사용하는 동안 정밀도를 지정할 필요가 없습니다 (값에 따라 정밀도를 동적으로 가져옵니다). 그러나 여기에 문제가 있습니다. 소수점 이후에 내 값이 2와 7 일 때마다 반환 값이 정밀도의 위치 수를 변경하는 것을 볼 수 있습니다.

간단한 예제를 통해이를 명확하게하겠습니다.

hive> select cast('34.2234' + '32.6554' -3.1 as double);
OK
63.7788
Time Taken 0.077 seconds, Fetched: 1 row(s)

소수점 이하 자릿수 (1을 빼는 동안 3.1에서 1) 뒤에 1을 사용하면 결과가 좋아 보인다는 것을 알 수 있습니다. 그러나 뺄셈에 3.2 또는 3.7이 주어지면 아래의 변화를 봅니다.

3.2를 사용하는 동안

hive> select cast('34.2234' + '32.6554' -3.2 as double);
OK
63.678799999999995
Time Taken 0.077 seconds, Fetched: 1 row(s)

3.7을 사용하는 동안

hive> select cast('34.2234' + '32.6554' -3.7 as double);
OK
63.178799999999995
Time Taken 0.077 seconds, Fetched: 1 row(s)

결과는 정확 해 보이지만이 경우 왜 정밀도가 변경됩니까? 소수점 앞의 값을 사용하고 그 뒤에 2 또는 7 만 사용하면 동일합니다 (4.2, 4.7, 3.2, 2.7 등). 2와 7에 특이하여 정밀도를 15 값으로 변경하고 다른 값은 그렇지 않습니다.

해결법

  1. ==============================

    1.이것이 부동 소수점 산술의 모습입니다

    이것이 부동 소수점 산술의 모습입니다

    hive> select 1.1 + 0.1;
    OK
    1.2000000000000002
    

    정확하고 예측 가능한 것을 원한다면 십진수를 사용하십시오.

    hive>  select cast (1.1 as decimal(12,2)) + cast (0.1 as decimal(12,2));
    OK
    1.2
    
  2. ==============================

    2.계산 정밀도와 표시된 소수점을 혼동한다고 생각합니다.

    계산 정밀도와 표시된 소수점을 혼동한다고 생각합니다.

    Hive는 항상 동일한 계산 정밀도를 사용하지만 후행 0을 표시하지는 않습니다.

    따라서 때로는 소수의 소수만 반환하지만 부동 소수점 숫자 집합에 '적합'하지 않은 숫자를 사용하면 끝까지 소수를 표시합니다.

  3. from https://stackoverflow.com/questions/43362996/hive-double-precision by cc-by-sa and MIT license