首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Databricks Version7.0与版本6.3不同:不能将类java.lang.Long转换为java.lang.Integer类

Databricks Version7.0与版本6.3不同:不能将类java.lang.Long转换为java.lang.Integer类
EN

Stack Overflow用户
提问于 2020-06-20 22:07:13
回答 1查看 1.3K关注 0票数 3

我有一个工作笔记本在蔚蓝数据库6.3版-火花2.4.4

这个笔记本用它的连接器对Azure Synapse分析器进行输入

当我将笔记本升级到7.0-Spark3.0.0版本时,该过程开始失败,出现以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: HdfsBridge::record recordReaderFillBuffer-遇到意外错误,填充记录读取器缓冲区: ClassCastException: java.lang.Long类不能转换为java.lang.Integer类(java.lang.Long和java.lang.Integer位于加载程序‘java.lang.Long’的模块java.base中) ErrorCode = 106000

这是Synapse分析中的表模式:

代码语言:javascript
复制
CREATE TABLE [dbo].[IncrementalDestination]
(
[Id] [int] NOT NULL,
[VarChar] [varchar](1000) NULL,
[Char] [char](1000) NULL,
[Text] [varchar](1000) NULL,
[NVarChar] [nvarchar](1000) NULL,
[NChar] [nchar](1000) NULL,
[NText] [nvarchar](1000) NULL,
[Date] [date] NULL,
[Datetime] [datetime] NULL,
[Datetime2] [datetime2](7) NULL,
[Smalldatetime] [smalldatetime] NULL,
[Bigint] [bigint] NULL,
[Bit] [bit] NULL,
[Decimal] [decimal](18, 0) NULL,
[Int] [int] NULL,
[Money] [money] NULL,
[Numeric] [numeric](18, 0) NULL,
[Smallint] [smallint] NULL,
[Smallmoney] [smallmoney] NULL,
[Tinyint] [tinyint] NULL,
[Float] [float] NULL,
[Real] [real] NULL,
[Column With Space] [varchar](1000) NULL,
[Column_ç_$pecial_char] [varchar](1000) NULL,
[InsertionDateUTC] [datetime] NOT NULL,
[De_LastUpdated] [datetime2](3) NOT NULL
)
WITH
(
DISTRIBUTION = ROUND_ROBIN,
CLUSTERED COLUMNSTORE INDEX
)
GO

这是Databricks在阅读Azure BlobStorage中的一堆parquets之后生成的模式

代码语言:javascript
复制
root
 |-- Id: long (nullable = true)
 |-- VarChar: string (nullable = true)
 |-- Char: string (nullable = true)
 |-- Text: string (nullable = true)
 |-- NVarChar: string (nullable = true)
 |-- NChar: string (nullable = true)
 |-- NText: string (nullable = true)
 |-- Date: timestamp (nullable = true)
 |-- Datetime: timestamp (nullable = true)
 |-- Datetime2: timestamp (nullable = true)
 |-- Smalldatetime: timestamp (nullable = true)
 |-- Bigint: long (nullable = true)
 |-- Bit: boolean (nullable = true)
 |-- Decimal: long (nullable = true)
 |-- Int: long (nullable = true)
 |-- Money: double (nullable = true)
 |-- Numeric: long (nullable = true)
 |-- Smallint: long (nullable = true)
 |-- Smallmoney: double (nullable = true)
 |-- Tinyint: long (nullable = true)
 |-- Float: double (nullable = true)
 |-- Real: double (nullable = true)
 |-- Column_With_Space: string (nullable = true)
 |-- Column_ç_$pecial_char: string (nullable = true)
 |-- InsertionDateUTC: timestamp (nullable = true)
 |-- De_LastUpdated: timestamp (nullable = false)

我看到了这个

代码语言:javascript
复制
Int: long (nullable = true)

但我能做什么呢?

这种转换不应该是自然而容易的吗?

我想这些新特性有什么不同。

EN

回答 1

Stack Overflow用户

发布于 2020-06-22 07:40:01

我认为这是由以下变化引起的,如在迁移指南中描述所示

在Spark3.0中,当向具有不同数据类型的表列插入值时,类型强制按照ANSI SQL标准执行。不允许某些不合理的类型转换,如将字符串转换为int,将double转换为布尔值。如果值超出列的数据类型,则引发运行时异常。星火2.4及更低版本的允许在插入表期间进行类型转换,只要它们是有效的强制转换。当将超出范围的值插入积分字段时,将插入该值的低阶位(与Java/Scala数字类型转换相同)。例如,如果257被插入到字节类型的字段中,结果是1。行为由选项spark.sql.storeAssignmentPolicy控制,默认值为“ANSI”。将选项设置为“Legacy”将恢复以前的行为。

因此,您可以尝试将spark.sql.storeAssignmentPolicy设置为Legacy并重新运行代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62492265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档