Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Внимание
Эта функция доступна в общедоступной предварительной версии в Databricks Runtime 15.4 LTS и выше.
Таблицы с включенным расширением типов позволяют изменять типы данных столбцов на более широкий тип без перезаписи базовых файлов данных. Можно изменить типы столбцов вручную или использовать эволюцию схемы для развития типов столбцов.
Внимание
Расширение типов доступно в Databricks Runtime 15.4 LTS и выше. Таблицы с включенным расширением типов можно читать только в Databricks Runtime 15.4 LTS и выше.
Для расширения типов данных требуется Delta Lake. Все управляемые таблицы каталога Unity используют Delta Lake по умолчанию.
Поддерживаемые изменения типов
Типы можно расширить в соответствии со следующими правилами:
Тип источника | Поддержка более широкого спектра типов |
---|---|
byte |
short , , int long , decimal double |
short |
int
long
decimal
double
|
int |
long
decimal
double
|
long |
decimal |
float |
double |
decimal |
decimal с большей точностью и масштабированием |
date |
timestampNTZ |
Чтобы избежать случайного преобразования целочисленных значений в десятичные, необходимо вручную зафиксировать изменения типов из byte
, short
, int
, или long
на decimal
или double
. При приведении целочисленного типа к decimal
или double
, если какой-либо поток записывает это значение обратно в целочисленный столбец, Spark усечет дробную часть значений по умолчанию.
Примечание.
При изменении любого числового типа на decimal
общая точность должна быть равна или больше начальной точности. При увеличении масштаба общая точность должна увеличиваться на соответствующую сумму.
Минимальное целевое значение для типов byte
, short
и int
— decimal(10,0)
. Минимальная цель для long
— decimal(20,0)
.
Если вы хотите добавить два десятичных разряда к полю с decimal(10,1)
, минимальное значение — decimal(12,3)
.
Изменения типов поддерживаются для столбцов и полей верхнего уровня, вложенных в структуры, карты и массивы.
Включение расширения типов
Вы можете включить расширение типов в существующей таблице, задав для свойства таблицы delta.enableTypeWidening
значение true
:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true')
Вы также можете включить расширение типов во время создания таблицы:
CREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')
Внимание
При включении расширения типов устанавливается функция таблицы typeWidening
, которая обновляет протоколы чтения и записи. Для взаимодействия с таблицами с включенным расширением типов необходимо использовать Databricks Runtime 15.4 или более поздней версии. Если внешние клиенты также взаимодействуют с таблицей, убедитесь, что они поддерживают эту функцию таблицы. См. сведения о совместимости функций Delta Lake и протоколах.
Применение изменения типа вручную
ALTER COLUMN
Используйте команду для ручного изменения типов:
ALTER TABLE <table_name> ALTER COLUMN <col_name> TYPE <new_type>
Эта операция обновляет схему таблицы без перезаписи базовых файлов данных.
Расширенные типы с автоматической эволюцией схемы
Эволюция схемы работает с расширением типов для обновления типов данных в целевых таблицах в соответствии с типом входящих данных.
Примечание.
Без включения расширения типов, при эволюции схемы всегда предпринимаются попытки привести данные к более узким типам столбцов в целевой таблице. Если вы не хотите автоматически расширить типы данных в целевых таблицах, отключите расширение типов перед запуском рабочих нагрузок с включенной эволюцией схемы.
Чтобы использовать эволюцию схемы для расширения типа данных для столбца при его загрузке, необходимо выполнить следующие условия:
- Команда записи выполняется с включенной автоматической эволюцией схемы.
- Целевая таблица имеет поддержку расширения типа.
- Тип исходного столбца шире, чем тип целевого столбца.
- Процесс расширения типов поддерживает изменение типа данных.
- Изменение типа не является одним из
byte
,short
,int
,long
илиdecimal
илиdouble
. Эти изменения типов можно применять только вручную с помощью ALTER TABLE, чтобы избежать случайного преобразования целых чисел в десятичные типы.
Несоответствия типов, которые не соответствуют всем этим условиям, соответствуют обычным правилам применения схемы. См. соблюдение схемы.
Отключение функции расширения типов данных в таблице
Чтобы предотвратить расширение случайного типа в включенных таблицах, присвоив свойству значение false
:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'false')
Этот параметр предотвращает изменения будущих типов в таблице, но не удаляет функцию расширения типов или отменяет изменения типов.
Если необходимо полностью удалить функции таблицы расширения типа, можно использовать команду DROP FEATURE
, как показано в следующем примере:
ALTER TABLE <table-name> DROP FEATURE 'typeWidening' [TRUNCATE HISTORY]
Примечание.
Для таблиц, включающих расширение типов с помощью Databricks Runtime 15.4 LTS, вместо этого требуется удалить функцию typeWidening-preview
.
При удалении расширения типов все файлы данных, которые не соответствуют текущей схеме таблицы, перезаписываются. См. Управление функцией удаления таблицы Delta Lake и понижение протокола таблицы.
Потоковая передача из таблицы Delta
Примечание.
Поддержка расширения типов в структурированной потоковой передаче доступна в Databricks Runtime 16.3 и выше.
При потоковой передаче из таблицы Delta изменения типов обрабатываются как не аддитивные изменения схемы, аналогичные переименованию или удалению столбца с сопоставлением столбцов.
Вы можете указать местоположение схемы отслеживания, чтобы включить потоковую передачу из таблиц Delta Lake с примененным изменением типа.
Для каждого потока чтения для источника данных должен быть указан свой schemaTrackingLocation
. Указанный параметр schemaTrackingLocation
должен содержаться в каталоге, указанном для checkpointLocation
целевой таблицы для потоковой записи.
Примечание.
Для потоковых рабочих нагрузок, объединяющих данные из нескольких исходных разностных таблиц, необходимо указать уникальные каталоги в checkpointLocation
каждой исходной таблице.
Параметр schemaTrackingLocation
используется для указания пути для отслеживания схем, как показано в следующем примере кода:
Питон
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
язык программирования Scala
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
После предоставления расположения отслеживания схемы поток будет развивать свою отслеживаемую схему всякий раз, когда обнаруживается изменение типа, а затем останавливается. В то время вы можете выполнить любое необходимое действие для обработки изменения типа, например включение расширения типов в нижней таблице или обновление потокового запроса.
Чтобы возобновить обработку, задайте конфигурацию spark.databricks.delta.streaming.allowSourceColumnTypeChange
Spark или параметр allowSourceColumnTypeChange
средства чтения DataFrame.
Питон
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
# alternatively to allow all future type changes for this stream:
# .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
язык программирования Scala
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
// alternatively to allow all future type changes for this stream:
// .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
SQL
-- To unblock for this particular stream just for this series of schema change(s):
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange.ckpt_<checkpoint_id> = "<delta_source_table_version>"
-- To unblock for this particular stream:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "<delta_source_table_version>"
-- To unblock for all streams:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "always"
Идентификатор <checkpoint_id>
контрольной точки и версия <delta_source_table_version>
исходной таблицы Delta Lake отображаются в сообщении об ошибке при остановке потока.
Delta Sharing (Дельта шаринг)
Примечание.
Поддержка расширения типов в Delta Sharing доступна в Databricks Runtime 16.1 и выше.
Совместное использование таблицы Delta Lake с включенным расширением типов поддерживается в Databricks to Databricks Delta Sharing. Поставщик и получатель должны находиться в Databricks Runtime 16.1 или более поздней версии.
Чтобы прочитать поток данных изменений из таблицы Delta Lake с включенным расширением типа с помощью Delta Sharing, необходимо задать формат ответа следующим образом: delta
.
spark.read
.format("deltaSharing")
.option("responseFormat", "delta")
.option("readChangeFeed", "true")
.option("startingVersion", "<start version>")
.option("endingVersion", "<end version>")
.load("<table>")
Чтение канала данных изменений при изменении типов не поддерживается. Вместо этого необходимо разделить операцию на два отдельных чтения: одно заканчивается на версии таблицы, содержащей изменение типа, а другое начинается с версии, содержащей изменение типа.
Ограничения
Совместимость Айсберг
Айсберг не поддерживает все изменения типа, охватываемые расширением типа, см. в разделе "Эволюция схемы Айсберга". В частности, Azure Databricks не поддерживает следующие изменения типа:
-
byte
,short
int
long
илиdecimal
double
- увеличение десятичного масштабирования
-
date
доtimestampNTZ
Если в таблице Delta Lake включена совместимость UniForm с Iceberg, применение одной из этих изменений типов приводит к ошибке.
При применении одного из этих неподдерживаемых изменений типа к таблице Delta Lake включение совместимости с Iceberg в таблице приводит к ошибке. Чтобы устранить эту ошибку, необходимо удалить функцию расширения таблицы типа.
Другие ограничения
- Предоставление местоположения отслеживания схемы с помощью SQL при потоковой передаче из таблицы Delta Lake, в которой произошли изменения типа, не поддерживается.
- Совместное использование таблицы, используя Delta Sharing с включенной функцией расширения типов, с потребителями, не являющимися пользователями Databricks, не поддерживается.