ошибка класса ARITHMETIC_OVERFLOW
<message>
.
<alternative>
Если необходимо, установите для <config>
значение "false", чтобы обойти эту ошибку.
Параметры
- сообщение: описание выражения, вызывающего переполнение.
- альтернативные: советы по предотвращению ошибки.
- конфигурации: параметр конфигурации, изменяющий режим ANSI.
Объяснение
Арифметическое переполнение происходит, когда Azure Databricks выполняет математическую операцию, превышающую максимальный диапазон типа данных, в котором выполняется операция.
Во многих случаях математика выполняется в наименее распространенном типе операндов оператора или наименее распространенного типа аргументов функции.
Добавление двух чисел типа TINYINT
может быстро превышать диапазон типов, ограниченный от -128
до +127
.
Другие типы, такие как TIMESTAMP
и INTERVAL
также имеют большой, но конечный диапазон.
Определение домена типа см. в определении для типа данных.
Смягчение
Устранение этой ошибки зависит от причины:
являются ли математические или какие-либо из входных аргументов неверными?
Исправьте используемые функции или входные данные соответствующим образом.
Вы также можете рассмотреть возможность переупорядочения операций, чтобы сохранить промежуточные результаты в требуемом диапазоне.
Тип данных не самый широкий?
Расширите тип путем приведения одного из аргументов к типу, достаточному для завершения операции.
Выбор
DOUBLE
илиDECIMAL(38, s)
с соответствующимs
обеспечивает широкий диапазон за счёт округления.Можно ли терпеть условия переполнения и заменить их
NULL
?Измените выражение, чтобы использовать функцию, предложенную в
alternative
. Например, используйте try_sum вместо sum.Вы не можете изменить выражение, или вы скорее получите сгруппированные результаты, чем получить ошибку?
В качестве последнего средства отключите режим ANSI, установив для
ansiConfig
значениеfalse
.
Примеры
-- 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;