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

Внимание

Delta Lake liquid кластеризация доступен в общедоступной предварительной версии в Databricks Runtime 13.3 и более поздних версий. Некоторая поддержка жидкости кластеризация существует в Databricks Runtime 12.2 LTS и выше. См. сведения о совместимости таблиц с ликвидной кластеризация.

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

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

Databricks Runtime 13.3 LTS и более поздних версий требуется для создания, записи или OPTIMIZE разностных таблиц с включенной ликвидной кластеризация.

Примечание.

Таблицы с поддержкой кластеризация поддержки параллелизма на уровне строк в Databricks Runtime 13.3 LTS и более поздних версий. Параллелизм на уровне строк обычно доступен в Databricks Runtime 14.2 и выше для всех таблиц с включенными векторами удаления. См . сведения о уровнях изоляции и конфликтах записи в Azure Databricks.

Для чего используется жидкость кластеризация?

Databricks рекомендует жидкость кластеризация для всех новых таблиц Delta. Ниже приведены примеры сценариев, в которых удобно использовать кластеризацию:

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

Включение кластеризация жидкости

Вы можете включить кластер liquid в существующей таблице или во время создания таблицы. Кластеризация несовместима с секционированием или ZORDERтребует, чтобы клиент Azure Databricks управлял всеми операциями макета и оптимизации для данных в таблице. После включения запустите OPTIMIZE задания как обычные для добавочных данных кластера. Узнайте, как активировать кластеризация.

Чтобы включить ликвидную кластеризация, добавьте фразу CLUSTER BY в инструкцию создания таблицы, как показано в приведенных ниже примерах:

Примечание.

В Databricks Runtime 14.2 и более поздних версиях можно использовать API кадра данных и API DeltaTable в Python или Scala, чтобы включить ликвидную кластеризация.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) USING DELTA CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.format("delta").clusterBy("col0").saveAsTable("table2")

# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.format("delta").clusterBy("col0").saveAsTable("table2")

// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

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

Таблицы, созданные с поддержкой liquid кластеризация, имеют множество функций разностной таблицы, включенных при создании и использовании delta writer версии 7 и читателя версии 3. Вы можете переопределить включение некоторых из этих функций. См. раздел "Переопределение функций по умолчанию" (необязательно).

Версии протокола таблицы не могут быть понижены, а таблицы с включенными кластеризация недоступны для чтения клиентами Delta Lake, которые не поддерживают все функции таблицы протокола delta reader. Узнайте, как Azure Databricks управляет совместимостью функций Delta Lake?.

В Databricks Runtime 13.3 LTS и более поздних версиях можно включить ликвидную кластеризация в существующей непартиментной таблице Delta с помощью следующего синтаксиса:

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

Переопределение включения компонентов по умолчанию (необязательно)

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

  1. Используется ALTER TABLE для задания свойства таблицы, которое отключает одну или несколько функций. Например, чтобы отключить векторы удаления, выполните следующие действия:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Включите ликвидную кластеризация в таблице, выполнив следующую команду:

    ALTER TABLE <table_name>
    CLUSTER BY (<clustering_columns>)
    

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

Функция Delta Совместимость среды выполнения Свойство для переопределения включения Влияние отключения на ликвидную кластеризация
Векторы удаления Для чтения и записи требуется Databricks Runtime 12.2 lTS и более поздних версий. 'delta.enableDeletionVectors' = false Параллелизм на уровне строк отключен, что делает транзакции и кластеризация операции более вероятными для конфликта. См. статью "Конфликты записи с параллелизмом на уровне строк".

DELETE, MERGEи UPDATE команды могут выполняться медленнее.
Отслеживание строк Записи требуют Databricks Runtime 13.3 LTS и более поздних версий. Можно считывать из любой версии Databricks Runtime. 'delta.enableRowTracking' = false Параллелизм на уровне строк отключен, что делает транзакции и кластеризация операции более вероятными для конфликта. См. статью "Конфликты записи с параллелизмом на уровне строк".
Контрольные точки версии 2 Для чтения и записи требуется Databricks Runtime 13.3 LTS и более поздних версий. 'delta.checkpointPolicy' = 'classic' Не влияет на поведение жидкости кластеризация.

Выбор ключей кластеризация

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

Кластеризация поддерживает следующие типы данных для ключей кластеризация:

  • Дата
  • Метка времени
  • TimestampNTZ (требуется Databricks Runtime 14.3 LTS или более поздней версии)
  • Строка
  • Целое число
  • Long
  • Короткие
  • Тип с плавающей запятой
  • Двойной
  • Десятичное число
  • Байт
  • Логический

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

Текущий метод оптимизации данных Рекомендация по ключам кластеризация
Секционирование в стиле Hive Используйте столбцы секционирования в качестве ключей кластеризация.
Индексирование Z-порядка ZORDER BY Используйте столбцы как ключи кластеризация.
Секционирование в стиле Hive и порядок Z Используйте как столбцы секционирования, так и ZORDER BY столбцы в качестве ключей кластеризация.
Созданные столбцы для уменьшения карта inality (например, даты для метки времени) Используйте исходный столбец в качестве ключа кластеризация и не создавайте созданный столбец.

Запись данных в кластеризованную таблицу

Необходимо использовать клиент записи Delta, поддерживающий все функции таблицы протоколов разностной записи, используемые жидкостью кластеризация. В Azure Databricks необходимо использовать Databricks Runtime 13.3 LTS и выше.

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

  • INSERT INTO Операций
  • Операторы CTAS
  • COPY INTO из формата Parquet
  • spark.write.format("delta").mode("append")

Примечание.

Кластеризация на записи — это лучшее приложение, которое не применяется в следующих ситуациях:

  • Если операция записи превышает 512 ГБ данных.
  • Если вложенный SELECT запрос содержит преобразование, фильтр или соединение.
  • Если проецируемые столбцы не совпадают с исходной таблицей.

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

Активация кластеризация

Чтобы активировать кластеризация, необходимо использовать Databricks Runtime 13.3 LTS или более поздней версии. OPTIMIZE Используйте команду в таблице, как показано в следующем примере:

OPTIMIZE table_name;

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

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

Чтение данных из кластеризованной таблицы

Данные в кластеризованной таблице можно считывать с помощью любого клиента Delta Lake, поддерживающего чтение векторов удаления. Для получения наилучших результатов запроса включите ключи кластеризация в фильтры запросов, как показано в следующем примере:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Изменение ключей кластеризация

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

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

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

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

ALTER TABLE table_name CLUSTER BY NONE;

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

Узнайте, как кластеризована таблица

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

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Совместимость таблиц с жидкими кластеризация

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

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

Вы можете отключить протоколы таблиц версии 2 проверка и более поздних версий для чтения таблиц с ликвидной кластеризация в Databricks Runtime 12.2 LTS и более поздних версиях. См. сведения о функциях таблицы Drop Delta.

Ограничения

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

  • Для ключей кластеризации можно указывать лишь столбцы, в которых производится сбор статистики. По умолчанию в таблице Delta сбор статистики производится для первых 32 столбцов.
  • Можно указать до 4 столбцов в качестве ключей кластеризации.
  • Нагрузки структурированных потоков не поддерживают кластеризацию при записи.