ARITHMETIC_OVERFLOW エラー クラス
<message>
.
<alternative>
必要であれば、<config>
を "false" に設定してこのエラーを回避します。
パラメーター
- message: オーバーフローの原因となっている式の説明。
- alternative: エラーの回避方法に関する助言。
- config: ANSI モードを変更するための構成設定。
説明
算術オーバーフローは、演算が実行されるデータ型の最大範囲を超える数学演算を Azure Databricks で実行したときに発生します。
多くの場合、計算は演算子のオペランドの最小共通型または関数の引数の最小共通型で実行されます。
型 TINYINT
の 2 つの数値を加算すると、-128
から +127
までに制限される型範囲をすぐに超える可能性があります。
TIMESTAMP
や INTERVAL
など、その他の型にも、大きいが有限の範囲が与えられます。
型のドメインの定義に付いては、データ型の定義をご覧ください。
対応策
このエラーの対応策は、原因によって異なります。
演算またはいずれかの入力引数が間違っていませんか。
使用されている関数または入力されたデータを適宜修正してください。
中間の結果が望ましい範囲に収まるよう、演算の並べ替えも検討してください。
データ型は最も広い型ですか。
演算を完了するのに十分な型にいずれかの引数をキャストすることで型を広げます。
DOUBLE
またはDECIMAL(38, s)
と適切なs
を選択すると、丸めが必要になりますが範囲が広くなります。オーバーフロー条件を許容し、それを
NULL
で置換できますか。alternative
で提案された関数を使用するように式を変更します。 たとえば、sum の代わりに try_sum を使用します。式を変更できませんか。エラーが返されず、ラップされた結果が与えられますか。
最後の手段として、
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;