Обнаружение секций для внешних таблиц

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

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

Что такое стратегия обнаружения секций по умолчанию для каталога Unity?

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

Использование ведения журнала метаданных секции

В Databricks Runtime 13.3 LTS и более поздних версиях можно при желании включить журналирование метаданных разделов, стратегию обнаружения разделов для внешних таблиц, зарегистрированных в Unity Catalog. Это поведение соответствует стратегии обнаружения секций, используемой в хранилище метаданных Hive. Это поведение влияет только на внешние таблицы каталога Unity, которые имеют секции и используют Parquet, ORC, CSV, Avro или JSON. Databricks рекомендует включить новое поведение для повышения скорости чтения и производительности запросов для этих таблиц.

Внимание

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

Это поведение станет значением по умолчанию в будущей версии Databricks Runtime. Таблицы с включенной функцией можно читать или записывать только с помощью Databricks Runtime 13.3 LTS и более поздних версий.

Включить ведение журнала метаданных раздела

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

CREATE OR REPLACE TABLE <catalog>.<schema>.<table-name>
USING <format>
PARTITIONED BY (<partition-column-list>)
TBLPROPERTIES ('partitionMetadataEnabled' = 'true')
LOCATION 'abfss://<bucket-path>/<table-directory>';

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

Вы также можете использовать Spark conf для включения метаданных секций для текущей службы SparkSession. При включении внешние таблицы, созданные в SparkSession, будут созданы с включенным свойством таблицы метаданных секции. По умолчанию конференц-связь Spark отключена.

В следующем синтаксисе показано использование SQL для задания конференц-связи Spark в записной книжке. При настройке вычислений можно также задать конфигурации Spark.

SET spark.databricks.nonDelta.partitionLog.enabled = true;

Вы можете переопределить конфигурацию Spark, непосредственно включив или отключив свойство таблицы при создании таблицы.

Внимание

Таблицы можно считывать и записывать только с помощью ведения журнала метаданных секций в Databricks Runtime 13.3 LTS и выше. Чтобы прочитать эти таблицы, используя Databricks Runtime 12.2 LTS, необходимо удалить и заново создать таблицу с отключённым свойством метаданных разделов.

Внешние таблицы не удаляют базовые файлы данных при их удалении. Databricks рекомендует использовать синтаксис CREATE OR REPLACE для обновления таблиц с целью применения логирования метаданных разделов, как показано в следующем примере:

CREATE OR REPLACE TABLE <catalog>.<schema>.<table-name>
USING <format>
PARTITIONED BY (<partition-column-list>)
LOCATION 'abfss://<bucket-path>/<table-directory>';

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

  • Проверьте раздел свойств таблицы, возвращенный DESCRIBE EXTENDED table_name.
  • Проверьте метаданные таблицы с помощью обозревателя каталогов.

Свойства таблицы содержат partitionMetadataEnabled=true.

Каталог Unity применяет правила для путей, пересекающихся с таблицами и томами. Нельзя зарегистрировать новую таблицу каталога Unity в коллекции файлов данных, если таблица уже существует в этом расположении.

Работа с таблицами с метаданными партиций

Databricks рекомендует использовать имена таблиц во всех операциях чтения и записи для всех таблиц, зарегистрированных в каталоге Unity. Для таблиц с метаданными разделов это гарантирует, что новые разделы, добавленные в таблицу, регистрируются в каталоге Unity, и запросы к таблице считывают все зарегистрированные разделы.

Использование шаблонов, основанных на пути, для операций чтения или записи может привести к игнорированию разделов или их незарегистрированности в хранилище метаданных каталога Unity. См. ограничения.

Список разделов

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

SHOW PARTITIONS <table-name>

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

SHOW PARTITIONS <table-name>
PARTITION (<partition-column-name> = <partition-column-value>)

Добавление, удаление или восстановление метаданных секции вручную

Каталог Unity требует, чтобы все разделы для внешних таблиц были включены в директорию, зарегистрированную с помощью оператора LOCATION при регистрации таблицы.

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

Azure Databricks использует секционирование в стиле Hive для хранения таблиц, поддерживаемых Parquet, ORC, CSV и JSON. Секции в стиле Hive содержат пары ключ-значение, соединенные знаком равенства в каталоге секции, например year=2021/month=01/.

Если в таблице используется секционирование в стиле Hive, можно использовать MSCK REPAIR для синхронизации метаданных секций в каталоге Unity с секциями, существующими в расположении таблицы. В следующих примерах синтаксиса показаны распространенные операции:

-- Add and remove parition metadata to match directories in table location
MSCK REPAIR TABLE <table_name> SYNC PARTITIONS;

-- Add partitions in the table location that are not registered as partition metadata
MSCK REPAIR TABLE <table_name> ADD PARTITIONS;

-- Drop partitions registered as partition metadata that are not in the table location
MSCK REPAIR TABLE <table_name> DROP PARTITIONS;

См. REPAIR TABLE.

Вручную укажите пути для других типов секций

Если таблица не использует секционирование в стиле Hive, необходимо вручную указать расположения секций при добавлении секций. Указание секций вручную также может снизить задержку по сравнению с MSCK REPAIR синтаксисом, особенно для таблиц с большим количеством секций. В следующем примере синтаксиса показано добавление раздела:

ALTER TABLE <table-name>
ADD PARTITION (<partition-column-name> = <partition-column-value>)
LOCATION 'abfss://<bucket-path>/<table-directory>/<partition-directory>';

Вы также можете использовать ALTER TABLE синтаксис для удаления, переименования, восстановления и задания расположений для секций. См. ALTER TABLE ... PARTITION.

Ограничения

Применяются следующие ограничения:

  • Нельзя читать или записывать в таблицы с метаданными разбиения, включенными в Databricks Runtime 12.2 LTS или ниже.
  • Чтение таблицы с помощью пути к каталогу возвращает все секции, включая все, которые были добавлены или удалены вручную.
  • Если вы вставляете или перезаписываете записи в таблицу, используя путь вместо имени таблицы, метаданные секции не записываются.