classe di errore DIVIDE_BY_ZERO
Divisione per zero. Usare try_divide
per tollerare che il divisore sia 0 e restituire invece NULL.
Se necessario, impostare su <config>
"false" per ignorare questo errore.
Parametri
- ansiConfig: nome della configurazione per modificare il comportamento.
Spiegazione
Azure Databricks genera questo errore ogni volta che tenta di dividere un valore INTERVAL o numerico per 0
.
Le informazioni sul contesto fornite con questo errore isolano l'oggetto e l'espressione all'interno della quale si è verificato l'errore.
Funzioni e operatori come mod, che possono causare questo errore includono quelli che eseguono la divisione come parte di formule più complesse.
Mitigazione
La mitigazione dell'errore dipende dalla causa:
L'espressione che causa l'errore è corretto?
Se l'espressione non è corretta, in modo che il
0
valore non possa verificarsi e ripetere la query.I dati sono corretti?
Se i dati di input devono essere in grado di generare il passaggio dei
0
valori, potrebbe essere necessario correggere i dati nell'origine o pulirli prima di passare i dati alla funzione come argomento.La pulizia dei dati può significare escludere le righe che causano l'errore, convertire i
0
valori inNULL
usando nullif(expr, 0)o convertire i dati in un altro valore accettabile usando if(expr = 0, alt, expr).
Se l'espressione e i dati sono corretti e si vuole tollerare la divisione per zero, è possibile usare try_divide.
In alternativa, modificare l'argomento in nullif(expr, 0).
In questo modo l'espressione restituirà NULL
invece di un errore.
Se si preferisce è possibile usare nvl(try_divide(expr1, expr2), alt) per trasformare il risultato NULL
in valori alternativi, ad esempio elementi neutrali per l'aggiunta 0
o la moltiplicazione 1
.
Come soluzione dell'ultima risorsa, quando non è possibile modificare l'espressione o il flusso di dati, è possibile disabilitare questo comportamento ANSI impostando l'oggetto fornito ansiconfig
su false
. Si noti che questa impostazione è consequenziale oltre la condizione di errore immediata.
Esempi
-- 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