Переименовать и удалить столбцы с помощью сопоставления столбцов в Delta Lake

На этой странице описывается, как сопоставление столбцов Delta Lake позволяет изменять только метаданные, чтобы пометить столбцы как удаленные или переименованные без перезаписи файлов данных.

Azure Databricks поддерживает сопоставление столбцов для таблиц Delta Lake. Сопоставление столбцов позволяет вносить изменения только в метаданные, чтобы пометить столбцы как удаленные или переименованные без перезаписи данных. Сопоставление столбцов также позволяет использовать символы, не разрешенные Parquet в именах столбцов, таких как пробелы. Это позволяет напрямую получать данные CSV или JSON в Delta без переименования столбцов.

Предварительные требования и ограничения

Прежде чем включить сопоставление столбцов, ознакомьтесь со следующими ограничениями:

Включение сопоставления столбцов

Используйте следующую команду, чтобы включить сопоставление столбцов в id режиме новой таблицы:

CREATE table <table-name> (
  id INT,
  name STRING
)
USING DELTA
TBLPROPERTIES (
  'delta.columnMapping.mode' = 'id'
);

Используйте следующую команду, чтобы включить сопоставление столбцов в name режиме существующей таблицы:

ALTER TABLE <table-name> SET TBLPROPERTIES (
  'delta.columnMapping.mode' = 'name'
)

Дополнительные сведения о режимах сопоставления столбцов см. в разделе "Режимы сопоставления столбцов".

Для сопоставления столбцов требуются следующие протоколы Delta:

  • Версия прочитчика 2 или выше
  • Версия Writer 5 или более поздняя

См. сведения о совместимости функций Delta Lake и протоколах.

Переименование столбца

Примечание.

Доступно в Databricks Runtime 10.4 LTS и более поздних версиях.

Если сопоставление столбцов включено для таблицы Delta, можно переименовать столбец:

ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name

Дополнительные примеры см. в разделе "Обновление схемы таблицы".

Удаление столбцов

Примечание.

Доступно в Databricks Runtime 11.3 LTS и более поздних версиях.

Если сопоставление столбцов включено для таблицы Delta, можно удалить один или несколько столбцов:

ALTER TABLE table_name DROP COLUMN col_name
ALTER TABLE table_name DROP COLUMNS (col_name_1, col_name_2, ...)

Дополнительные сведения см. в разделе "Обновление схемы таблицы".

Режимы сопоставления столбцов

Элементы delta.columnMapping.mode управления свойствами таблицы позволяют изменять только метаданные, чтобы пометить столбцы как удаленные или переименованные без перезаписи файлов данных. Доступны перечисленные ниже режимы.

  • none (по умолчанию): сопоставление столбцов не включено. Имена столбцов подчиняются ограничениям Parquet для именования.
  • name: это позволяет переименовать и удалять только метаданные столбцов и разрешает специальные символы в именах столбцов. name режим можно задать в новых и существующих таблицах.
  • id: это позволяет переименовать и удалять только метаданные столбцов и разрешает специальные символы в именах столбцов. id режим должен быть задан для создания таблицы и не может быть задан в существующих таблицах.

Примечание.

Databricks рекомендует id режим для большинства вариантов использования в целях совместимости. Однако режим name автоматически устанавливается, если вы не предоставляете значение для delta.columnMapping.mode и включаете функции совместимости с Iceberg, такие как UniForm.

Поддерживаемые символы в именах столбцов

Если сопоставление столбцов включено для таблицы Delta, можно включить пробелы и любые из этих символов в имена столбцов: ,;{}()\n\t=

Удалите сопоставление столбцов

Сопоставление столбцов можно удалить из таблицы с помощью следующей команды:

ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.columnMapping.mode' = 'none')

Предупреждение

При удалении сопоставления столбцов все файлы данных перезаписываются для замены имен физических столбцов логическими именами. Эта операция не поддерживает разрешение конфликтов на уровне строк или физическом уровне.

Параллельные операции записи могут вызывать ConcurrentModificationException. Перед удалением сопоставления столбцов:

  1. Приостанавливайте все параллельные операции записи, включая задания потоковой передачи и конвейеры ETL.
  2. Отключите прогнозную оптимизацию в таблице.
  3. Для больших таблиц запланируйте эту операцию в периоды низкой активности.

Альтернативный подход, поддерживающий понижение уровня протокола таблицы, см. в разделе "Отключить сопоставление столбцов".

Отключить сопоставление столбцов

В Databricks Runtime 15.3 и более поздних версиях можно использовать DROP FEATURE команду для удаления сопоставления столбцов и понижения уровня протокола таблицы. Используйте этот подход вместо удаления сопоставления столбцов, если требуется понижение версий протокола для совместимости с более старыми средствами чтения.

Внимание

Удаление сопоставления столбцов из таблицы не удаляет случайные префиксы, используемые в именах каталогов для секционированных таблиц.

См. Управление функцией удаления таблицы Delta Lake и понижение протокола таблицы.

Сопоставление столбцов и потоковая передача

Вы можете указать расположение для отслеживания схемы, чтобы активировать потоковую передачу из таблиц Delta с активированным сопоставлением столбцов. Это преодолевает проблему, из-за которой изменения схемы, не являющиеся аддитивными, могут привести к сломанным потокам.

Для каждого потока чтения для источника данных должен быть указан свой schemaTrackingLocation. Указанный schemaTrackingLocation должен содержаться в каталоге, указанном для checkpointLocation целевой таблицы для потоковой записи. Для рабочих нагрузок потоковой передачи, которые объединяют данные из нескольких исходных таблиц Delta, необходимо указать уникальные каталоги в каждой исходной checkpointLocation таблице.

Включение сопоставления столбцов в работающем задании

Внимание

Чтобы включить сопоставление столбцов в работающем задании потоковой передачи:

  1. Остановить задание
  2. Включить сопоставление столбцов в таблице
  3. Перезапустите задание (первый перезапуск — инициализирует сопоставление столбцов)
  4. Перезапустите задание еще раз (второй перезапуск — включает изменения схемы)

Любые дальнейшие изменения схемы (добавление или удаление столбцов, изменение типов столбцов) также требуют перезапуска задания.

Указать местоположение отслеживания схемы

В следующем примере показано, как задать потоковое чтение из таблицы Delta с сопоставлением столбцов:

checkpoint_path = "/path/to/checkpointLocation"

(spark.readStream
  .option("schemaTrackingLocation", checkpoint_path)
  .table("delta_source_table")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .toTable("output_table")
)

Дальнейшие шаги