Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
<message>.
<alternative> Jika perlu, atur <config> menjadi "false" untuk melewati kesalahan ini.
Parameter-parameternya
- pesan: Deskripsi ekspresi yang menyebabkan luapan.
- alternatif: Sarankan tentang cara menghindari kesalahan.
- konfigurasi: Pengaturan untuk mengubah mode ANSI.
Penjelasan
Luapan aritmatika terjadi ketika Azure Databricks melakukan operasi matematika yang melebihi rentang maksimum jenis data tempat operasi dilakukan.
Dalam banyak kasus matematika dilakukan dalam jenis operand yang paling tidak umum dari operator, atau jenis argumen yang paling tidak umum dari fungsi.
Menambahkan dua angka jenis TINYINT dapat dengan cepat melebihi rentang jenis yang dibatasi dari -128 ke +127.
Jenis lain seperti TIMESTAMP dan INTERVAL juga memiliki rentang besar, tetapi terbatas.
Untuk definisi domain jenis, lihat definisi untuk jenis data.
Mitigasi
Mitigasi untuk kesalahan ini tergantung pada penyebabnya:
Apakah matematika atau argumen input salah?
Perbaiki fungsi yang digunakan atau sesuaikan data input sebagaimana mestinya.
Anda juga dapat mempertimbangkan untuk menyusun ulang operasi untuk menjaga hasil menengah dalam rentang yang diinginkan.
Apakah tipe data bukan tipe terluas?
Perluas tipe dengan mengubah salah satu argumen ke jenis yang memadai untuk menyelesaikan operasi.
Memilih
DOUBLEatauDECIMAL(38, s)dengansyang sesuai memberikan banyak rentang namun ada konsekuensi pembulatan.Dapatkah Anda mentolerir kondisi luapan dan menggantinya dengan
NULL?Ubah ekspresi untuk menggunakan fungsi yang diusulkan dalam
alternative. Misalnya gunakan try_sum alih-alih penjumlahan.Anda tidak dapat mengubah ekspresi dan Anda lebih memilih untuk mendapatkan hasil yang dikemas daripada mengembalikan kesalahan?
Sebagai upaya terakhir, nonaktifkan mode ANSI dengan mengatur
ansiConfigkefalse.
Contoh
-- 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;