Оптимизация макета файла данных

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

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

Таблицы Delta Lake без liquid-кластеризации могут при необходимости включать конструкцию ZORDER BY, чтобы улучшить кластеризацию данных при перезаписи. Таблицы Apache Iceberg используют стратегии кластеризации и сортировки вместо ZORDER. Databricks рекомендует использовать жидкую кластеризацию вместо секций ZORDER или других подходов к структурированию данных.

См. OPTIMIZE.

Important

В Databricks Runtime 16.0 и последующих версиях вы можете использовать OPTIMIZE FULL для принудительного повторного кластеризации таблиц с включенной жидкостной кластеризацией. См. статью "Принудительное перекластеривание".

Примеры синтаксиса

Активируйте сжатие, выполнив OPTIMIZE команду:

SQL

OPTIMIZE table_name

Python

API DeltaTable Python специально предназначен для Delta Lake.

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()

Scala

API Scala DeltaTable специфичен для Delta Lake.

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()

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

SQL

OPTIMIZE table_name WHERE date >= '2022-11-18'

Python

API DeltaTable Python специально предназначен для Delta Lake.

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Scala

API Scala DeltaTable специфичен для Delta Lake.

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Рассмотрим следующие сведения для упаковки корзины:

  • Оптимизация упаковки данных в контейнеры является идемпотентной, что означает, что если её провести дважды на одном и том же наборе данных, второй запуск не окажет никакого влияния.
  • Алгоритм bin-packing направлен на то, чтобы формировать равномерно сбалансированные файлы данных по их размеру в хранилище, но не обязательно по числу кортежей в каждом файле. Однако эти два меры часто коррелируются.

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

OPTIMIZE возвращает статистику файла (min, max, total и т. д.) для удаленных файлов и файлов, добавленных этой операцией. Функция Optimize Stats также содержит статистику по Z-упорядочению, число пакетов и оптимизированные разделы.

Вы также можете автоматически сжимать небольшие файлы с помощью автоматического сжатия. См. раздел "Автоматическое сжатие".

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

При выборе частоты выполнения OPTIMIZEсуществует компромисс между производительностью и затратами. Для повышения производительности запросов конечных пользователей запустите OPTIMIZE чаще. Это приведет к более высокой стоимости из-за увеличения использования ресурсов. Чтобы оптимизировать затраты, запустите его реже.

Databricks рекомендует сначала запускать OPTIMIZE ежедневно, а затем настроить частоту, чтобы сбалансировать затраты и производительность.

Обе операции требуют значительных ресурсов ЦП и включают большие объемы декодирования и кодирования Parquet.

Databricks рекомендует типы оптимизированных для вычислений экземпляров. OPTIMIZE также извлекает выгоду из подключенных SSD.