ARITHMETIC_OVERFLOW, klasa błędów
<message>
.
<alternative>
W razie potrzeby ustaw <config>
wartość "false", aby pominąć ten błąd.
Parametry
- message: opis wyrażenia powodującego przepełnienie.
- alternatywa: Doradź, jak uniknąć błędu.
- config: 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 jest wykonywana 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 ograniczony zakres.
Aby uzyskać definicję domeny typu, zobacz definicję typu danych.
Łagodzenia
Ograniczenie ryzyka dla tego błędu zależy od przyczyny:
Czy matematyka lub którykolwiek z argumentów wejściowych są niepoprawne?
Popraw używane funkcje lub dane wejściowe odpowiednio.
Możesz również rozważyć zmiana kolejności operacji w celu zachowania wyników pośrednich w żądanym zakresie.
Czy typ danych nie jest najszerszym typem?
Rozszerzanie typu przez rzutowanie jednego z argumentów do typu wystarczającego do ukończenia operacji.
Wybór
DOUBLE
lubDECIMAL(38, s)
odpowiednis
zapewnia wiele zakresów kosztem zaokrąglania.Czy można tolerować warunki przepełnienia i zastąpić je
NULL
?Zmień wyrażenie, aby użyć funkcji proponowanej w pliku
alternative
. Na przykład użyj try_sum zamiast sumy.Nie można zmienić wyrażenia i raczej uzyskać opakowane wyniki niż zwracać błąd?
W ostateczności wyłącz tryb ANSI, ustawiając wartość na
ansiConfig
false
.
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;