apache-spark-sql - 插入覆盖在 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
为什么我会收到此错误?
解决方案
你有一个类型不匹配。
与任何其他插入语句一样,您必须确保 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:字符串(可为空=真)
您会注意到,在我的示例中,第一个输出的最后两行是字符串和十进制,而第二个输出反转了十进制和字符串。这是一个以错误的列顺序插入的简单案例。在您的情况下,请确保无论列名如何,类型都相互兼容。
推荐阅读
- reactjs - 我们如何让 array.map 返回的类型在 typescript 中用作 React 组件?
- python - Python 中被阻止的 GET 请求的解决方法
- ios - 随着相机移开,Scenekit 阴影逐渐消失
- scaling - 可以为主成分分析 (pca) 缩放标记/二进制数据吗?
- angular - 将 FormArray 传递给子组件
- javascript - 有没有办法在不影响其他切换的情况下切换列表中的类
- python - 有没有办法使用 scipy.optimize 优化具有分类参数的函数?
- r - 如何选择训练模型的最佳数据集
- list - Simply Scheme Lisp 中的子集/子序列递归过程
- java - 如何使用 nifi 将 kafka 数据放入 elasticsearch?