DIVIDE_BY_ZERO錯誤類別
除以零。 使用 try_divide
來容許除數為 0,並改為傳回 Null。
如有必要,請將 設定 <config>
為 「false」 以略過此錯誤。
參數
- ansiConfig:要變更行為的組態名稱。
解釋
每當 Azure Databricks 嘗試將 INTERVAL 或數值除以 0
時,就會引發此錯誤。
此錯誤所提供的內容資訊會隔離物件和發生錯誤的運算式。
mod之類的函式和運算子,可能會導致此錯誤,包括執行除法做為較複雜公式的一部分。
緩解
錯誤的風險降低取決於原因:
運算式是否導致錯誤正確?
如果運算式不正確,請修正它
0
,讓值無法發生,然後重試查詢。資料是否正確?
如果輸入資料應該能夠產生
0
傳遞的值,您可能需要修正來源的資料,或在將資料傳遞至函式做為引數之前清除它。資料清理可能表示排除違規的資料列、使用
0
NULL
nullif (expr、0) ,或使用 (expr = 0、alt、expr) 將資料轉換成另一個可接受的值。
如果運算式和資料正確,而且您想要容許除以零,您可以使用 try_divide。
或者,將 引數變更為 nullif (expr, 0) 。
這會導致運算式傳回 NULL
而非錯誤。
如果您偏好將 nvl (try_divide (expr1、expr2) 、alt) 轉換成 NULL
替代值,例如加法 0
或乘法 1
的中性元素。
最後一個解決方法是,當無法變更運算式或資料流程時,您可以將 提供的 ansiconfig
設定為 false
來停用此 ANSI 行為。 請注意,這項設定是超出立即錯誤狀況的衍生性。
例子
-- 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