ARITHMETIC_OVERFLOW 오류 클래스
<message>
.
<alternative>
필요한 경우 이 오류를 무시하려면 <config>
"false"로 설정합니다.
매개 변수
- 메시지: 오버플로를 유발하는 식에 대한 설명입니다.
- 대체: 오류를 방지하는 방법에 대해 조언합니다.
- 구성: ANSI 모드를 변경하는 구성 설정입니다.
설명
산술 오버플로는 Azure Databricks가 연산이 수행되는 데이터 형식의 최대 범위를 초과하는 수학 연산을 수행할 때 발생합니다.
대부분의 경우 연산자의 피연산자의 최소 공통 형식 또는 함수 인수의 최소 공통 형식에서 수학이 수행됩니다.
두 개의 형식 TINYINT
추가하면 -128
+127
제한되는 형식 범위를 빠르게 초과할 수 있습니다.
TIMESTAMP
및 INTERVAL
같은 다른 형식에도 크지만 한정된 범위가 있습니다.
형식의 도메인 정의는데이터 형식에 대한
완화
이 오류의 완화 방법은 원인에 따라 달라집니다.
수학 또는 입력 인수가 잘못되었나요?
사용된 함수 또는 입력 데이터를 적절하게 수정합니다.
중간 결과를 원하는 범위로 유지하기 위해 작업 순서를 다시 지정하는 것도 고려할 수 있습니다.
데이터 형식이 가장 넓은 형식이 아닌가요?
인수 중 하나를 작업을 완료하기에 충분한 형식으로 캐스팅하여 형식을 확장합니다.
적절한
DOUBLE
와 함께DECIMAL(38, s)
또는s
을 선택하면 더 많은 범위를 제공하지만, 반올림이 필요하게 됩니다.오버플로 조건을 감당하고
NULL
로 대체할 수 있나요?제안된 함수
alternative
를 사용하여 식을 변경합니다. 예를 들어 합계대신 try_sum을 사용해 보세요.식을 변경할 수 없으며, 오류를 반환하기보다는 래핑된 결과를 얻기를 원하십니까?
마지막 수단으로
ansiConfig
false
설정하여 ANSI 모드를 사용하지 않도록 설정합니다.
예제
-- 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;