Databricks версии 7.0 не ведет себя как версия 6.3: class java .lang.Long не может быть преобразован в class java .lang.Integer - PullRequest
1 голос
/ 21 июня 2020

У меня есть рабочий ноутбук с версией azure модулей данных 6.3 - Spark 2.4.4

Этот ноутбук выполняет поглощение в Azure Synapse Analytics, используя свой разъем

Когда я обновлял ноутбук до версии 7.0 - Spark 3.0.0, процесс начал сбой со следующей ошибкой:

com.microsoft.sqlserver.jdb c .SQLServerException: HdfsBridge :: recordReaderFillBuffer - Произошла непредвиденная ошибка заполнения буфер чтения записи: ClassCastException: class java .lang.Long не может быть преобразован в class java .lang.Integer (java .lang.Long и java .lang.Integer находятся в модуле java .base загрузчика 'bootstrap') [ErrorCode = 106000] [SQLState = S0001]

Это схема таблицы в Synapse Analytics:

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

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)

Но что я могу сделать?

Не надо ' t это преобразование должно быть естественным и простым d один?

Думаю, что-то сломалось с этими новыми функциями =]

1 Ответ

0 голосов
/ 22 июня 2020

Я считаю, что это вызвано следующим изменением, как описано в руководстве по миграции :

В Spark 3.0 при вставке значения в столбец таблицы с другими данными type, приведение типа выполняется в соответствии со стандартом ANSI SQL. Некоторые необоснованные преобразования типов, такие как преобразование строки в int и double в логическое значение, запрещены. Исключение времени выполнения генерируется, если значение выходит за пределы допустимого диапазона для типа данных столбца. В Spark версии 2.4 и ниже преобразования типов во время вставки таблицы разрешены, если они действительны Cast. При вставке значения вне диапазона в целочисленное поле вставляются младшие биты значения (то же самое, что и Java / Scala numeri c type casting). Например, если 257 вставлено в поле байтового типа, результатом будет 1. Поведение контролируется опцией spark.sql.storeAssignmentPolicy со значением по умолчанию как «ANSI». Установка параметра как «Legacy» восстанавливает предыдущее поведение.

Таким образом, вы можете попробовать установить spark.sql.storeAssignmentPolicy на Legacy и повторно запустить код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...