Поддержка сортировки для Delta Lake

В Databricks Runtime 16.4 LTS и более поздних версиях можно задавать правила сопоставления для строковых столбцов в таблицах Delta Lake, чтобы управлять сравнением строк и порядком сортировки на уровне отдельных столбцов, например включить сравнение без учета регистра или сортировку с учетом языковых параметров.

Полное описание типов сортировки, соглашений об именовании и правилах приоритета см. в разделе " Параметры сортировки".

По умолчанию Delta Lake задает сортировку для строковых полей на UTF8_BINARY.

Important

Включение параметров сортировки добавляет в вашу таблицу Delta Lake функцию таблицы collations writer, что влияет на совместимость с внешними считывателями и другими функциями платформы. Ознакомьтесь с разделом "Ограничения" прежде чем включить сопоставление в продукционных таблицах.

Создание таблицы с параметрами сортировки

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

CREATE TABLE catalog.schema.my_table (
  id BIGINT,
  name STRING COLLATE UTF8_LCASE,
  metadata STRUCT<label: STRING COLLATE UNICODE>,
  tags ARRAY<STRING COLLATE UTF8_LCASE>,
  properties MAP<STRING, STRING COLLATE UTF8_LCASE>
) USING delta

Замечание

MAP ключи не могут использовать сортировку. Только MAP значения поддерживают сортировку строк.

Изменение сортировки в существующем столбце

Параметры сортировки существующего столбца можно изменить с помощью ALTER TABLE.

Например, чтобы задать для столбца параметры сортировки без учета регистра:

ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE

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

--
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Обновление статистики и структуры данных после изменения сортировки

Изменение параметров сортировки столбца не перезаписывает существующие данные или обновляет статистику. Запросы возвращают правильные результаты немедленно в соответствии с новыми параметрами сортировки, но пропуск файлов и кластеризация могут быть менее эффективными, пока не выполните следующие действия:

  1. Обновите статистику пропуска файлов для столбца:
   ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
  1. Если в таблице используется кластеризация жидкости, переопределите макет кластеризации:
   OPTIMIZE FULL my_table
  1. Если в таблице используется ZORDER, отключите добавочную оптимизацию и переопределите все файлы:
   SET spark.databricks.optimize.incremental = false;
   OPTIMIZE my_table ZORDER BY zorder_column;

Пропуск этих шагов не приводит к неправильным результатам, но может снизить производительность запросов на исторические данные до следующей полной перезаписи.

Параметры сортировки всегда соблюдаются платформой Azure Databricks в результатах запроса.

Отключение сортировки для таблицы

Чтобы удалить функцию таблицы сортировки, задайте для каждого столбца сортировки значение UTF8_BINARY.

Сначала выполните следующую команду для каждого столбца с сортировкой:

ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Затем удалите функцию таблицы:

ALTER TABLE my_table DROP FEATURE collations

Дополнительные сведения см. в разделе Drop a Delta Lake table feature and downgrade table protocol.

Эволюция схемы и коллация

При изменении схемы добавляются или объединяются столбцы с указанными параметрами сортировки, применяются следующие правила:

  • Если исходный столбец уже существует в целевой таблице, параметры сортировки целевой таблицы для этого столбца сохраняются. Игнорируется коллация исходного столбца.
  • Если исходный столбец является новым и имеет заданный параметры сортировки, целевая таблица принимает параметры сортировки для нового столбца.
  • Если в целевой таблице функция таблицы collations еще не включена, то добавление столбца с сортировкой автоматически активирует ее.

Ограничения

Следующие ограничения применяются к таблицам Delta Lake с включенным параметром сортировки:

Совместимость и взаимодействие:

  • Внешние читатели, которые не распознают collations функцию таблицы, возвращаются UTF8_BINARY, что может привести к некорректным порядкам сортировки или сравнениям.
  • OpenSharing не поддерживает общий доступ к отдельным секциям в столбцах сортировки, отличных от по умолчанию. Вместо этого поделитесь таблицей.
  • UniForm не поддерживается для таблиц с параметрами сортировки.
  • Таблицы Delta Lake, созданные внешне с параметрами сортировки, не распознаваемыми databricks Runtime, вызывают исключение при запросе.
  • API OSS Delta Lake для Scala или Python не поддерживают коллацию. Используйте API Spark SQL или DataFrame.

Ограничения запросов и функций:

  • Распределенные столбцы не могут использоваться в CHECK ограничениях
  • Столбцы с указанным коллатором не могут быть использованы в генерируемых выражениях столбцов
  • Упорядоченные столбцы не могут использоваться с индексами фильтров Блума (устаревший)
  • Столбцы со свёртками нельзя использовать в запросах с отслеживанием состояния структурированной потоковой передачи (агрегации, соединения, дедупликация)
  • MAP Ключ не может быть отсортированной строкой. Только MAP значения поддерживают сортировку

Дополнительные ресурсы