ARITHMETIC_OVERFLOW エラークラス
<message>
。<alternative>
必要に応じて、このエラーをバイパスするために "false" に set<config>
します。
Parameters
- メッセージ: オーバーフローの原因となった式の説明。
- 別の: エラーを回避する方法についてアドバイスします。
- 構成: ANSI モードを変更するための構成設定。
説明
算術オーバーフローは、操作が実行されるデータ型の最大範囲を超える数学的演算を Azure Databricks が実行すると発生します。
多くの場合、算術演算は、演算子のオペランドの最も一般的でない型、または関数の引数の最も一般的でない型で実行されます。
2 つの型 TINYINT
を追加すると、-128
から +127
に制限されている型の範囲をすぐに超える可能性があります。
TIMESTAMP
や INTERVAL
などの他の型にも、大きな有限範囲があります。
型のドメインの定義については、データ型の
緩和
このエラーの軽減策は、原因によって異なります。
数値演算または入力引数のいずれかが正しくありませんか?
必要に応じて、使用されている関数または入力データを修正します。
中間結果を目的の範囲に保つために、操作の並べ替えを検討することもできます。
データ型が最も広い型ではありませんか?
いずれかの引数を演算を完了するのに十分な型にキャストして、型を拡大します。
DOUBLE
またはDECIMAL(38, s)
と適切なs
を選択すると、丸めが必要になりますが、範囲は広くなります。オーバーフロー状態を許容し、
NULL
に置き換えることができますか?alternative
で提案された関数を使用するように式を変更します。 たとえば、sumの代わりに try_sum を使用します。式を変更できませんか。エラーが返されず、ラップされた結果をgetしますか?
最後の手段として、
ansiConfig
をfalse
に設定して ANSI モードを無効にします。
例示
-- 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;