ARITHMETIC_OVERFLOW: klasa błędów
<message>
.
<alternative>
W razie potrzeby ustaw <config>
na "false", aby ominąć ten błąd.
Parametry
- komunikatu: opis wyrażenia powodującego przepełnienie.
- alternatywne: Podaj wskazówki, jak uniknąć błędu.
- konfiguracji: ustawienie konfiguracji umożliwiające zmianę trybu ANSI.
Wyjaśnienie
Przepełnienie arytmetyczne występuje, gdy usługa Azure Databricks wykonuje operację matematyczną, która przekracza maksymalny zakres typu danych, w którym wykonywana jest operacja.
W wielu przypadkach matematyka jest wykonywana w najmniej typowym typie operandów operatora lub najmniej typowym typem argumentów funkcji.
Dodanie dwóch liczb typu TINYINT
może szybko przekroczyć zakres typów, który jest ograniczony z -128
do +127
.
Inne typy, takie jak TIMESTAMP
i INTERVAL
również mają duży, ale skończony zakres.
Aby uzyskać definicję domeny typu, zobacz definicję dla typu danych.
Łagodzenia
Ograniczenie ryzyka tego błędu zależy od przyczyny:
Czy matematyka czy którykolwiek z argumentów wejściowych jest niepoprawny?
Popraw używane funkcje lub dane wejściowe odpowiednio.
Możesz również rozważyć zmianę kolejności operacji, aby zachować wyniki pośrednie w żądanym zakresie.
Czy typ danych nie jest najszerszym typem?
Poszerz typ przez rzutowanie jednego z argumentów do typu wystarczającego do ukończenia operacji.
Wybór
DOUBLE
lubDECIMAL(38, s)
z odpowiednims
zapewnia dużo zakresu kosztem zaokrąglania.Czy można tolerować warunki przepełnienia i zastąpić je
NULL
?Zmień wyrażenie, aby użyć funkcji proponowanej w
alternative
. Na przykład użyj try_sum zamiast sum.Nie można zmienić wyrażenia i wolisz otrzymać wynik w postaci opakowanej, zamiast błędu?
W ostateczności wyłącz tryb ANSI, ustawiając
ansiConfig
nafalse
.
Przykłady
-- 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;
Powiązane
- funkcja try_add
- funkcji try_divide
- funkcji try_multiply
- funkcja try_subtract
- try_sum funkcji agregującej
- ANSI_MODE
- typy danych