Поделиться через


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

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

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

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

См. OPTIMIZE.

Важный

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

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

Сжатие запускается с помощью команды OPTIMIZE:

SQL

OPTIMIZE table_name

Питон

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

язык программирования Scala

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

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

SQL

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

Питон

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

язык программирования Scala

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

Примечание.

  • Оптимизация для упаковки данных в контейнеры идемпотентна, что означает, что повторное выполнение на том же наборе данных не оказывает никакого эффекта.
  • Задача bin-упаковки в том, чтобы равномерно сбалансировать файлы данных в соответствии с их размером на диске, но при этом количество кортежей на файл не обязательно должно учитываться. Однако оба этих показателя часто бывают взаимозависимыми.
  • API Python и Scala для выполнения OPTIMIZE операций доступны в Databricks Runtime 11.3 LTS и более поздних версиях.

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

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

Как часто я должен запускать OPTIMIZE?

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

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

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

Какой тип экземпляра лучше всего подходит для запуска OPTIMIZE (упаковка и Z-Ordering)?

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

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