Сжатие файлов данных путем оптимизации в 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.