ARITHMETIC_OVERFLOW 오류 클래스
<message>
.
<alternative>
필요한 경우 이 오류를 무시하려면 "false"로 설정합니다 <config>
.
매개 변수
- message: 오버플로를 유발하는 식에 대한 설명입니다.
- 대안: 오류를 방지하는 방법에 대해 조언합니다.
- config: ANSI 모드를 변경하는 구성 설정입니다.
설명
산술 오버플로는 Azure Databricks가 연산이 수행되는 데이터 형식의 최대 범위를 초과하는 수학 연산을 수행할 때 발생합니다.
대부분의 경우 연산자의 피연산자의 최소 공통 형식 또는 함수 인수의 최소 공통 형식에서 수학이 수행됩니다.
두 개의 형식 TINYINT
수를 추가하면 에서 로 제한 -128
되는 형식 범위를 빠르게 초과할 +127
수 있습니다.
및 INTERVAL
와 같은 TIMESTAMP
다른 형식에도 크지만 유한한 범위가 있습니다.
형식의 도메인에 대한 정의는 데이터 형식에 대한 정의를 참조하세요.
완화 방법
이 오류에 대한 완화는 원인에 따라 달라집니다.
수학 또는 입력 인수가 올바르지 않은가요?
사용된 함수 또는 입력 데이터를 적절하게 수정합니다.
중간 결과를 원하는 범위로 유지하기 위해 작업의 순서를 다시 지정하는 것도 고려할 수 있습니다.
데이터 형식이 가장 넓은 형식이 아닌가요?
인수 중 하나를 작업을 완료하기에 충분한 형식으로 캐스팅하여 형식을 확장합니다.
DOUBLE
또는DECIMAL(38, s)
를 적절하게s
선택하면 반올림 시 많은 범위가 제공됩니다.오버플로 조건을 허용하고 ?(?)로
NULL
바꿀 수 있나요?에 제안된 함수를 사용하도록 식을 변경합니다
alternative
. 예를 들어 합계 대신 try_sum 사용합니다.식을 변경할 수 없으며 오류를 반환하는 것보다 래핑된 결과를 얻을 수 있나요?
최후의 수단으로 를 로 설정하여 ANSI 모드를
ansiConfig
false
사용하지 않도록 설정합니다.
예
-- An overflow of a small numeric
> SELECT 100Y * 100Y;
[ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.
-- Use a wider numeric to perform the operation by casting one of the operands
> SELECT 100Y * cast(100Y AS INTEGER);
10000
-- An overflow of a complex expression which can be rewritten
> SELECT 100Y * 10Y / 5;
[ARITHMETIC_OVERFLOW] 100S * 10S caused overflow.
If necessary set spark.sql.ansi.enabled to "false" (except for ANSI interval type) to bypass this error.
-- Rewrite the expression
> SELECT 100Y / 5 * 10Y;
200.0
-- An occasional overfklow that should be tolerated
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
[ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.
-- Allowing overflows to be treated as NULL
> SELECT try_multiply(arg1, arg2) FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
NULL
100
-- In Databricks SQL temporarily disable ANSI mode to tolerate incorrect overflow.
> SET ANSI_MODE = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
16
100
> SET ANSI_MODE = true;
-- In Databricks Runtime temporarily disable ANSI mode to tolerate incorrect overflow.
> SET spark.sql.ansi.enabled = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
16
100
> SET spark.sql.ansi.enabled = true;