Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
<message>.
<alternative> Szükség esetén állítsa a <config> "false" értékre a hiba megkerüléséhez.
Paraméterek
- üzenet: A túlcsordulást okozó kifejezés leírása.
- alternatív: Tanácsok a hiba elkerüléséhez.
- konfiguráció: Az ANSI-mód módosítására szolgáló beállítás.
Magyarázat
A számtani túlcsordulás akkor fordul elő, ha az Azure Databricks olyan matematikai műveletet hajt végre, amely meghaladja a művelet végrehajtásához szükséges adattípus maximális tartományát.
A matematikát sok esetben egy operátor operandusainak legkevésbé gyakori típusában, vagy a függvény argumentumainak legkevésbé gyakori típusában hajtják végre.
Két TINYINT típusú szám összeadása gyorsan meghaladhatja a típustartományt, amely -128 és +127között van.
Más típusok, például a TIMESTAMP és a INTERVAL is nagy, de véges tartománysal rendelkeznek.
Egy típus tartományának definícióját lásd a definíciónál azadattípus esetén.
Mérséklés
A hiba elhárítása az októl függ:
Helytelen a matematikai vagy bármely bemeneti argumentum?
Szükség szerint javítsa ki a használt függvényeket vagy a bemeneti adatokat.
Megfontolhatja a műveletek átrendezését is, hogy a köztes eredmények a kívánt tartományban maradjanak.
Az adattípus nem a legszélesebb típus?
Szélesítse a típust úgy, hogy az egyik argumentumot egy olyan típusra adhatja, amely elegendő a művelet végrehajtásához.
A
DOUBLEvagyDECIMAL(38, s)megfelelős-vel való kiválasztása sok tartományt biztosít, de a kerekítés költségére.El tudja viselni a túlcsordulási feltételeket, és lecserélheti őket
NULL?Módosítsa a kifejezést a
alternativejavasolt függvény használatára. Használja például a try_sum formát a sumhelyett.Nem módosíthatja a kifejezést, és inkább becsomagolt eredményeket kap, mint hibaüzenetet ad vissza?
Végső megoldásként tiltsa le az ANSI módot a
ansiConfigfalsebeállításával.
Példák
-- An overflow of a small numeric
> SELECT 100Y * 100Y;
[ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.
-- Use a wider numeric to perform the operation by casting one of the operands
> SELECT 100Y * cast(100Y AS INTEGER);
10000
-- An overflow of a complex expression which can be rewritten
> SELECT 100Y * 10Y / 5;
[ARITHMETIC_OVERFLOW] 100S * 10S caused overflow.
If necessary set spark.sql.ansi.enabled to "false" (except for ANSI interval type) to bypass this error.
-- Rewrite the expression
> SELECT 100Y / 5 * 10Y;
200.0
-- An occasional overfklow that should be tolerated
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
[ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.
-- Allowing overflows to be treated as NULL
> SELECT try_multiply(arg1, arg2) FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
NULL
100
-- In Databricks SQL temporarily disable ANSI mode to tolerate incorrect overflow.
> SET ANSI_MODE = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
16
100
> SET ANSI_MODE = true;
-- In Databricks Runtime temporarily disable ANSI mode to tolerate incorrect overflow.
> SET spark.sql.ansi.enabled = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
16
100
> SET spark.sql.ansi.enabled = true;