classe di errore ARITHMETIC_OVERFLOW
<message>
.
<alternative>
Se necessario, imposta set<config>
su "false" per ignorare questo errore.
Parameters
- messaggio: descrizione dell'espressione che causa l'overflow.
- alternativo: Consiglia come evitare l'errore.
- config: impostazione della configurazione per alterare la modalità ANSI.
Spiegazione
Un overflow aritmetico si verifica quando Azure Databricks esegue un'operazione matematica che supera la gamma massima del tipo di dato su cui viene eseguita l'operazione.
In molti casi la matematica viene eseguita nel tipo meno comune degli operandi di un operatore o nel tipo meno comune degli argomenti di una funzione.
L'aggiunta di due numeri di tipo TINYINT
può superare rapidamente l'intervallo di tipi limitato da -128
a +127
.
Altri tipi, come TIMESTAMP
e INTERVAL
, hanno anch'essi un intervallo grande ma finito.
Per una definizione del dominio di un tipo, vedere la definizione di per il tipo di dati.
Mitigazione
La mitigazione per questo errore dipende dalla causa:
La matematica o uno degli argomenti di input sono errati?
Correggere le funzioni usate o i dati di input in base alle esigenze.
È anche possibile prendere in considerazione la possibilità di riordinare le operazioni per mantenere i risultati intermedi nell'intervallo desiderato.
Il tipo di dato non è il tipo più ampio?
Ampliare il tipo di dato convertendo uno degli argomenti a un tipo sufficientemente grande per completare l'operazione.
La scelta di
DOUBLE
oDECIMAL(38, s)
con uns
appropriato offre un'ampia gamma al costo dell'arrotondamento.è possibile tollerare condizioni di overflow e sostituirle con
NULL
?Modificare l'espressione per usare la funzione proposta in
alternative
. Ad esempio, usare try_sum anziché sum.Non è possibile modificare l'espressione e si get risultati di cui è stato eseguito il wrapping anziché restituire un errore?
Come ultima risorsa, disabilitare la modalità ANSI impostando il
ansiConfig
sufalse
.
Esempi
-- 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;