DIVIDE_BY_ZERO hibaosztály
Osztás nullával. A használatával try_divide
elviselhető, hogy az osztó értéke 0, és null értéket ad vissza.
Ha szükséges, állítsa a "false" értéket <config>
a hiba megkerüléséhez.
Paraméterek
- ansiConfig: A konfiguráció neve a viselkedés módosításához.
Magyarázat
Az Azure Databricks ezt a hibát akkor észleli, amikor intervallumot vagy számokat próbál meg elosztani a következővel 0
: .
Az ezzel a hibával megadott környezeti információk elkülönítik azt az objektumot és kifejezést, amelyen belül a hiba történt.
Olyan függvények és operátorok, mint a mod, amelyek ezt a hibát okozhatják, az összetettebb képletek részeként osztást végző függvények.
Kezelés
A hiba elhárítása az októl függ:
Helyes-e a hibát okozó kifejezés?
Ha a kifejezés helytelen, javítsa ki, hogy az
0
érték ne fordul elő, majd próbálkozzon újra a lekérdezéssel.Helyesek az adatok?
Ha a bemeneti adatoknak képesnek kell lenniük az
0
értékek átadására, előfordulhat, hogy ki kell javítania az adatokat a forrásnál, vagy meg kell tisztítania, mielőtt argumentumként átadja az adatokat a függvénynek.Az adattisztítás azt jelentheti, hogy kizárja a jogsértő sorokat, nullif(expr, 0) használatával konvertálja az
0
értékeketNULL
, vagy ha(expr = 0, alt, expr) használatával konvertálja az adatokat egy másik elfogadható értékre.
Ha a kifejezés és az adatok helyesek, és nullával szeretné tolerálni az osztást, használhatja a try_divide.
Alternatív megoldásként módosítsa az argumentumot nullif(expr, 0) értékre.
Ez azt eredményezi, hogy a kifejezés hiba helyett visszatér NULL
.
Ha szeretné, ue nvl(try_divide(expr1, expr2), alt) értékre állíthatja az eredményül NULL
kapott értéket egy alternatív értékké, például semleges elemekké összeadás 0
vagy szorzás 1
céljából.
Végső megoldásként, ha a kifejezés vagy az adatfolyam nem módosítható, letilthatja ezt az ANSI-viselkedést a megadott ansiconfig
értékre false
állításával. Vegye figyelembe, hogy ez a beállítás az azonnali hibafeltételen túli következmény.
Példák
-- 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