이 글을 읽는 대상: 데이터 분석가, 여러 쿼리 엔진을 사용하는 데이터 엔지니어
최근 Impala를 사용하면서 나누기 연산에 대한 결괏값의 소수점 자릿수와 관련해 예상과 다른 값이 나오는 상황을 겪었습니다. 원인을 찾아본 경험을 공유하며, 비슷한 문제를 겪는 분들에게 참고가 될 수 있길 바랍니다.
문제 상황: 예상치 못한 소수점 자리수
DECIMAL(38, 2) 타입인 칼럼값을 BIGINT형 값으로 나눌 시 결괏값 타입이 DECIMAL(38, 2)가 아닌 DECIMAL(38, 6)으로 반환되는 상황을 확인했습니다.
연산 결과 값 타입 확인
쿼리 엔진 | 연산 식 | 결과값 | 결과값 타입 |
IMPALA | CAST(3482477 AS DECIMAL(38, 2)) / 30386 | 114.607944 | DECIMAL(38, 6) |
원인 분석: Impala의 Precision Truncation
If the resulting precision would be greater than 38, Impala truncates the result from the back, but keeps at least 6 fractional digits in scale and rounds.
결론적으로, 문제의 원인은 Impala가 연산 결과의 Precision이 38자리를 초과하는 경우 이를 자동으로 DECIMAL(38,6)으로 잘라내기 때문이었습니다.
Impala는 나누기 연산을 수행할 때 내부적으로 더 높은 Precision을 사용하여 계산을 진행합니다. 그러나 계산 결과의 Precision이 38자리를 넘어가면, 결괏값은 자동으로 DECIMAL(38,6)으로 잘라냅니다.
따라서 원하는 소수점까지 채워진 DECIMAL 결과를 얻기 위해서는 명시적인 타입 캐스팅이 필요합니다.
- 의도한 소수점 자릿수가 6번째 이상인 경우(ex. DECIMAL(32, 8)): 연산 대상 수 하나만이라도 먼저 타입 캐스팅을 해야 합니다.
- 의도한 소수점 자릿수가 6번째 이하인 경우(ex. DECIMAL(32, 2)): 연산 후 타입 캐스팅을 해야 합니다.
Trino에서는 발생하지 않은 이유
Trino는 DECIMAL 타입 연산 시 결과 Precision과 Scale을 동적으로 계산합니다. 결과적으로 연산 결과가 기대하는 Precision과 Scale에 가깝게 유지됩니다.
쿼리 엔진 | 연산 식 |
결과값
|
결과값 타입 |
TRINO | CAST(3482477 AS DECIMAL(38, 2)) / 30386 |
114.61
|
DECIMAL(38, 2) |
impala쿼리 엔진에서 Decimal 타입 Precision 관리 방식에 대해 깊이 이해할 수 있었습니다. 특히 연산 과정에서 Precision이 어떻게 조정되고, 이를 명시적으로 다뤄야 하는 상황을 알게 되었습니다.
참고자료:
https://impala.apache.org/docs/build/html/topics/impala_decimal.html
DECIMAL Data Type (Impala 3.0 or higher only)
The DECIMAL data type is a numeric data type with fixed scale and precision. The data type is useful for storing and doing operations on precise decimal values. Syntax: DECIMAL[(precision[, scale])] Precision: precision represents the total number of digit
impala.apache.org
'개발개발 > 이게 왜 안되지' 카테고리의 다른 글
dbt + Trino에서 현재 시각 표기 방식 (1) | 2025.03.30 |
---|---|
AWS linux에 도커 설치 (0) | 2022.11.19 |
MacMini M1 에서 Homebrew 설치 (0) | 2021.11.19 |
hunspell-ko 사용법 (mac M1), 이후 증상 (0) | 2021.11.19 |