DIVIDE_BY_ZERO 오류 클래스
0으로 나누기. 를 사용하여 try_divide
수수가 0이 되는 것을 허용하고 대신 NULL을 반환합니다.
필요한 경우 이 오류를 무시하려면 "false"로 설정합니다 <config>
.
매개 변수
- ansiConfig: 동작을 변경하는 구성의 이름입니다.
설명
Azure Databricks는 INTERVAL 또는 숫자를 0
로 나누려고 할 때마다 이 오류를 발생합니다.
이 오류와 함께 제공되는 컨텍스트 정보는 개체와 오류가 발생한 식을 격리합니다.
이 오류를 일으킬 수 있는 모드와 같은 함수 및 연산자에는 더 복잡한 수식의 일부로 나누기 수행 중인 함수가 포함됩니다.
완화 방법
오류 완화는 원인에 따라 달라집니다.
식이 오류를 발생시키는 것이 올바른가요?
식이 올바르지 않으면 값이
0
발생하지 않도록 수정하고 쿼리를 다시 시도합니다.데이터가 올바른가요?
입력 데이터로 인해
0
값이 전달될 수 있는 경우 데이터를 인수로 함수에 전달하기 전에 원본에서 데이터를 수정하거나 클린 해야 할 수 있습니다.데이터 정리는 잘못된 행을 제외하거나, 값을
NULL
nullif(expr, 0)를 사용하여 변환0
하거나 if(expr = 0, alt, expr)를 사용하여 데이터를 다른 허용 가능한 값으로 변환하는 것을 의미할 수 있습니다.
식과 데이터가 올바르고 나누기를 0으로 허용하려는 경우 try_divide 사용할 수 있습니다.
또는 인수를 nullif(expr, 0)로 변경합니다.
이렇게 하면 식이 오류 대신 반환 NULL
됩니다.
원하는 경우 nvl(try_divide(expr1, expr2), alt) 을 ue하여 결과를 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