ARITHMETIC_OVERFLOW エラークラス
<message>
.<alternative>
必要に応じて、 <config>
を "false" に設定して、このエラーを回避します。
パラメーター
- message : オーバーフローの原因となっている式の説明。
- 代替案 : エラーを回避する方法についてアドバイスします。
- config : ANSI モードを変更するための設定。
説明
算術オーバーフローは、Databricks が演算が実行されるデータ型の最大範囲を超える数学演算を実行すると発生します。
多くの場合、演算は、演算子のオペランドの最も一般的でない型、または関数の引数の最も一般的でない型で実行されます。
TINYINT
つの数値を 2 つ追加すると、-128
から +127
に制限されているタイプ範囲をすぐに超える可能性があります。TIMESTAMP
やINTERVAL
などの他のタイプも、範囲は広く、有限です。
タイプのドメインの定義については、 データタイプの定義を参照してください。
緩和
このエラーの軽減策は、原因によって異なります。
-
数学または入力引数のいずれかが正しくありませんか?
必要に応じて、使用されている関数または入力データを修正します。
また、中間結果を目的の範囲に保持するために、操作の順序を変更することも検討できます。
-
データ型が最も幅の広い型ではありませんか?
引数の 1 つを操作を完了するのに十分な型にキャストして、型を広げます。
適切な
s
を持つDOUBLE
またはDECIMAL(38, 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;
1.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;