我有一个工作笔记本在蔚蓝数据库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分析中的表模式:
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之后生成的模式
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)我看到了这个
Int: long (nullable = true)但我能做什么呢?
这种转换不应该是自然而容易的吗?
我想这些新特性有什么不同。
发布于 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并重新运行代码。
https://stackoverflow.com/questions/62492265
复制相似问题