ARITHMETIC_OVERFLOW třída chyb
<message>
.
<alternative>
V případě potřeby nastavte <config>
hodnotu false, aby se tato chyba obešla.
Parametry
- message: Popis výrazu, který způsobuje přetečení.
- alternativní: Poraďte, jak se této chybě vyhnout.
- config: Nastavení konfigurace pro změnu režimu ANSI.
Vysvětlení
K aritmetickému přetečení dochází, když Azure Databricks provede matematickou operaci, která překračuje maximální rozsah datového typu, ve kterém se operace provádí.
V mnoha případech se matematika provádí v nejméně společném typu operandů operátoru nebo v nejméně společném typu argumentů funkce.
Přičtením dvou čísel typu TINYINT
lze rychle překročit rozsah typů, který je omezen od -128
do +127
.
Jiné typy, jako TIMESTAMP
je a INTERVAL
, mají také velký, ale konečný rozsah.
Definici domény typu najdete v definici datového typu.
Zmírnění
Zmírnění této chyby závisí na příčině:
Jsou matematické argumenty nebo některý ze vstupních argumentů nesprávný?
Opravte použité funkce nebo případně vstupní data.
Můžete také zvážit změnu pořadí operací, aby se mezivýsledky zachovaly v požadovaném rozsahu.
Není datový typ nejširším typem?
Rozšiřte typ přetypováním jednoho z argumentů na typ, který je dostatečný k dokončení operace.
Volba
DOUBLE
neboDECIMAL(38, s)
s vhodnous
možností poskytuje velký rozsah za cenu zaokrouhlení.Můžete tolerovat podmínky přetečení a nahradit je ?
NULL
Změňte výraz tak, aby používal funkci navrženou v nástroji
alternative
. Například místo součtu použijte try_sum.Nemůžete změnit výraz a místo vrácení chyby raději dostanete zabalené výsledky?
Jako poslední možnost zakažte režim ANSI nastavením na
ansiConfig
false
.
Příklady
-- 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;