ARITHMETIC_OVERFLOW hibaosztály
<message>
.<alternative>
Ha szükséges, állítsa "false" értékre <config>
a hiba megkerüléséhez.
Paraméterek
- message: A túlcsordulást okozó kifejezés leírása.
- alternatíva: Tanácsot ad a hiba elkerüléséhez.
- config: Az ANSI mód módosítására vonatkozó konfigurációs beállítás.
Magyarázat
Aritmetikai túlcsordulás akkor fordul elő, ha az Azure Databricks olyan matematikai műveletet hajt végre, amely meghaladja a műveletet végrehajtó 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 típusszám TINYINT
hozzáadása gyorsan meghaladhatja a típustartományt, amely a típusra +127
-128
korlátozódik.
Más típusok, például TIMESTAMP
a és INTERVAL
a is nagy, de véges tartománnyal rendelkeznek.
A típus tartományának definícióját az adattípus definíciójában találja.
Kezelés
A hiba elhárítása az októl függ:
Helytelenek a matematikai vagy a bemeneti argumentumok?
Javítsa ki a használt függvényeket vagy a bemeneti adatokat a megfelelő módon.
Megfontolhatja a műveletek átrendezését is, hogy a köztes eredményeket a kívánt tartományban tartsa.
Nem az adattípus a legszélesebb típus?
Bővítse a típust úgy, hogy az argumentumok egyikét egy olyan típusra írja, amely elegendő a művelet végrehajtásához.
A vagy
DECIMAL(38, s)
a megfelelővels
való választásDOUBLE
sok tartományt biztosít a kerekítés költségén.El tudja tűrni a túlcsordulási feltételeket, és lecserélni őket a-ra
NULL
?Módosítsa a kifejezést a következőben
alternative
javasolt függvény használatára: . Például try_sum használjon összeg helyett.Nem módosíthatja a kifejezést, és inkább burkolt eredményeket kap, mint hibát?
Végső megoldásként tiltsa le az ANSI-módot a
ansiConfig
értékrefalse
á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;