ARITHMETIC_OVERFLOW classe de erro
<message>
.
<alternative>
Se necessário, set<config>
"false" para ignorar esse erro.
Parameters
- mensagem: Uma descrição da expressão que causa o overflow.
- alternativa: Aconselhe sobre como evitar o erro.
- config: A definição de 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 do tipo TINYINT
pode exceder rapidamente o intervalo de tipos, que é limitado de -128
a +127
.
Outros tipos, como TIMESTAMP
e INTERVAL
também têm uma gama grande, mas finita.
Para obter uma definição do domínio de um tipo, consulte a definição de para o tipo de dados.
Atenuação
A atenuação para este erro depende da causa:
A matemática ou algum dos argumentos de entrada estão incorretos?
Corrija as funções utilizadas ou os dados de cálculo, conforme adequado.
Você também pode considerar operações de reordenação para manter os resultados intermediários no intervalo desejado.
O tipo de dados não é o tipo mais amplo?
Alargue o tipo convertendo um dos argumentos para um tipo suficiente para concluir a operação.
Escolher
DOUBLE
ouDECIMAL(38, s)
com umas
apropriada proporciona grande alcance à custa de arredondamento.Você pode tolerar condições de transbordamento 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.Você não pode alterar a expressão e prefere get resultados encapsulados do que retornar um erro?
Como último recurso, desative 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;