Classe de erro ARITHMETIC_OVERFLOW
<message>
.<alternative>
Se necessário, defina <config>
como "false" para ignorar esse erro.
Parâmetros
- message: uma descrição da expressão que causa o estouro.
- alternativo: aconselhe como evitar o erro.
- config: A configuração para alterar o modo ANSI.
Explicação
Um estouro aritmético ocorre quando o Azure Databricks executa uma operação matemática que excede o intervalo máximo do tipo de dados no qual a operação é executada.
Em muitos casos, a matemática é executada no tipo menos comum dos operandos de um operador ou no tipo menos comum dos argumentos de uma função.
Adicionar dois números de tipo TINYINT
pode exceder rapidamente o intervalo de tipos limitado de -128
a +127
.
Outros tipos, como TIMESTAMP
e INTERVAL
, também têm um intervalo grande, mas finito.
Para obter uma definição do domínio de um tipo, consulte a definição de para o tipo de dados.
Mitigação
A mitigação desse erro depende da causa:
A matemática ou qualquer um dos argumentos de entrada estão incorretos?
Corrija as funções usadas ou os dados de entrada conforme apropriado.
Você também pode considerar a reordenação de operações para manter resultados intermediários no intervalo desejado.
O tipo de dados não é o tipo mais amplo?
Amplie o tipo convertendo um dos argumentos em um tipo suficiente para concluir a operação.
Escolher
DOUBLE
ouDECIMAL(38, s)
com ums
apropriado fornece um grande intervalo com o custo do arredondamento.Você pode tolerar condições de estouro e substituí-las por
NULL
?Altere a expressão para usar a função proposta em
alternative
. Por exemplo, use try_sum em vez de sum.Não é possível alterar a expressão e você prefere obter resultados encapsulados do que retornar um erro?
Como último recurso, desabilite o modo ANSI definindo o
ansiConfig
comofalse
.
Exemplos
-- 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;