Classe de erro DIVIDE_BY_ZERO
Divisão por zero. Use try_divide
para tolerar que o divisor seja 0 e, em vez disso, retorne NULL.
Se necessário, defina <config>
como “false” para ignorar esse erro.
Parâmetros
- ANSIConfig : O nome da configuração para alterar o comportamento.
Explicação
O Databricks gera esse erro sempre que tenta dividir um INTERVALO ou um número por 0
.
As informações de contexto fornecidas com esse erro isolam o objeto e a expressão em que o erro ocorreu.
Funções e operadores como mod, que podem causar esse erro, incluem aqueles que estão executando a divisão como parte de fórmulas mais complexas.
Mitigação
A mitigação do erro depende da causa:
-
A expressão que está causando o erro está correta?
Se a expressão estiver incorreta, corrija-a para que o valor
0
não ocorra e repita a consulta. -
Os dados estão corretos?
Se os dados de entrada puderem resultar na passagem dos valores
0
, talvez seja necessário corrigir os dados na fonte ou limpá-los antes de passá-los para a função como argumento.A limpeza de dados pode significar excluir as linhas ofensivas, converter os valores
0
emNULL
usando nullif (expr, 0) ou converter os dados em outro valor aceitável usando if (expr = 0, alt, expr).
Se a expressão e os dados estiverem corretos e você quiser tolerar a divisão por zero, poderá usar try_divide.
Como alternativa, altere o argumento para nullif (expr, 0).
Isso fará com que a expressão retorne NULL
em vez de um erro.
Se preferir, você pode usar nvl (try_divide (expr1, expr2), alt) para transformar o NULL
resultante em valores alternativos, como elementos neutros para adição 0
ou multiplicação 1
.
Como solução de último recurso, quando a expressão ou o fluxo de dados não puderem ser alterados, o senhor pode desativar esse comportamento ANSI definindo o ansiconfig
fornecido como false
. Observe que essa configuração tem consequências além da condição de erro imediato.
Exemplos
-- A DIVIDE_BY_ZERO in a embedded in view. The context information isolates the faiing function.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
[DIVIDE_BY_ZERO] Division by zero. To return NULL instead, use `try_divide`. If necessary set "spark.sql.ansi.enabled" to false (except for ANSI interval type) to bypass this error.
== SQL of VIEW v(line 1, position 7) ==
SELECT 1/val FROM VALUES(1), (0) AS T(val)
^^^^^
-- Tolerating division by zero by turning the result to NULL using try_divide.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT try_divide(1, val) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
NULL
-- Tolerating division by zero by turning the result to NULL using nullif
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1 / nullif(val, 0) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
NULL
-- Filtering out offensive rows
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val) WHERE val != 0;
> SELECT c1 FROM v;
1
-- Turning division by zero into division by a small number.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1 / if(val = 0, 1e-10, val) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
10000000000
-- Turning division by zero into a neutral element for addition.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT nvl(try_divide(1, val), 0) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
0
-- Disabling ANSI mode in Databricks SQL for the view definition only.
> SET ANSI_MODE = false;
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val);
> SET ANSI_MODE = true;
> SELECT c1 FROM v;
1
NULL
-- Disabling ANSI mode in Databricks Runtime for the view definition only.
> SET spark.sql.ansi.enabled = false;
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val);
> SET spark.sql.ansi.enabled = true;
> SELECT c1 FROM v;
1
NULL