首页 > 解决方案 > 插入覆盖在 Databricks 中的“BigInteger 将溢出支持的范围”上失败

问题描述

当像这样在 Databricks 中运行插入覆盖时:

INSERT OVERWRITE my_target_table SELECT * FROM my_source_table

我得到错误:

Error in SQL statement: SparkException: Job aborted.

查看堆栈跟踪,我看到了一个由子句:

java.lang.ArithmeticException: BigInteger would overflow supported range

为什么我会收到此错误?

标签: apache-spark-sqlsql-insertdatabricks

解决方案


你有一个类型不匹配。

与任何其他插入语句一样,您必须确保 select 语句中列的顺序和类型与要插入的表中的列的顺序和类型相匹配。

然而,与大多数现代 RDBMS 不同,此错误不会明确告诉您是哪一列导致了问题,因此对于大型插入,最简单的方法是将插入语句的选择部分转换为临时视图,然后打印模式临时视图和您尝试插入的表。

创建视图:

%sql
--INSERT OVERWRITE your_target_table
CREATE OR REPLACE TEMP VIEW temp_schema_test AS
SELECT * FROM your_source_table

然后打印两个模式:

%python
spark.table('your_target_table').printSchema()

%python
spark.table('your_source_table').printSchema()

他们将输出两个可能如下所示的列表:

|-- DEFAULT_DATE:时间戳(可为空=真)

|-- DEFAULT_LOCATION:字符串(可为空=真)

|-- NEW_ID:十进制(38,0)(可为空=真)

|-- NEW_RECEIPT_NUMBER:字符串(可为空=真)

|-- NEW_REQUEST_ID: decimal(38,0) (nullable = true)

和这个

|-- INTVW_DT:时间戳(可为空=真)

|-- CURR_LCTN: 字符串(可为空=真)

|-- CASE_IDENTIFIER: decimal(38,0) (nullable = true)

|-- REQUEST_ID:十进制(38,0)(可为空=真)

|-- RECEIPT_NUMBER:字符串(可为空=真)

您会注意到,在我的示例中,第一个输出的最后两行是字符串和十进制,而第二个输出反转了十进制和字符串。这是一个以错误的列顺序插入的简单案例。在您的情况下,请确保无论列名如何,类型都相互兼容。


推荐阅读