Сжатие файлов данных путем оптимизации в Delta Lake

См. раздел "ОПТИМИЗАЦИЯ".

Delta Lake на платформе Azure Databricks позволяет повысить скорость обработки запросов чтения из таблицы. Один из способов сделать это — объединить маленькие файлы в большие.

Примечание.

В Databricks Runtime 13.3 и более поздних версиях Databricks рекомендует использовать кластеризация для макета таблицы Delta. См. статью Использование "жидкой" кластеризации для таблиц Delta.

Databricks рекомендует использовать прогнозную оптимизацию для автоматического запуска OPTIMIZE для таблиц Delta. См . статью "Прогнозная оптимизация" для Delta Lake.

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

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

SQL

OPTIMIZE delta.`/data/events`

Python

from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

или, кроме того, можно также:

SQL

OPTIMIZE events

Python

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

Scala

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

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

SQL

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

Python

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

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
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 и т. д.) для удаленных файлов и файлов, добавленных этой операцией. Оптимизация статистики также содержит статистику по Z-упорядочению, число пакетов и оптимизированные секции.

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

Как часто я должен работать OPTIMIZE?

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

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

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

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

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