Compactación de archivos de datos con optimización en Delta Lake

Consulte OPTIMIZE.

Delta Lake en Azure Databricks puede mejorar la velocidad de las consultas de lectura de una tabla. Una manera de mejorar esta velocidad consiste en fusionar archivos pequeños en archivos más grandes.

Nota:

Tanto en Databricks Runtime 13.3 como en las versiones posteriores, Databricks recomienda usar la agrupación en clústeres para el diseño de tabla Delta. Consulte Uso de clústeres líquidos para tablas Delta.

Databricks recomienda usar la optimización predictiva para ejecutar automáticamente OPTIMIZE para las tablas de Delta. Consulte Optimización predictiva para Delta Lake.

Ejemplos de sintaxis

Para desencadenar la compactación, ejecute el comando 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()

o bien, como alternativa:

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()

Si tiene una gran cantidad de datos y solo desea optimizar un subconjunto de ellos, puede especificar un predicado de partición opcional mediante 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()

Nota:

  • La optimización del empaquetado en contenedores es idempotente, lo que significa que si se ejecuta dos veces en el mismo conjunto de datos, la segunda ejecución no tiene ningún efecto.
  • El objetivo del empaquetado en contenedores es generar archivos de datos equilibrados uniformemente con respecto a su tamaño en el disco, pero no necesariamente con respecto al número de tuplas por archivo. Sin embargo, las dos medidas a menudo están correlacionadas.
  • Las API de Python y Scala para ejecutar OPTIMIZE operación están disponibles en Databricks Runtime 11.3 LTS y versiones posteriores.

Los lectores de tablas de Delta usan aislamiento de instantáneas, lo que significa que no se interrumpen cuando OPTIMIZE quitan los archivos innecesarios del registro de transacciones. OPTIMIZE no realiza ningún cambio relacionado con los datos en la tabla, por lo que una lectura antes y después de OPTIMIZE tiene los mismos resultados. Aplicar OPTIMIZE en una tabla que es un origen de streaming no afecta a las secuencias actuales ni futuras que tratan esta tabla como origen. OPTIMIZE devuelve las estadísticas de archivo (mín., máx., total, etc.) de los archivos quitados y los archivos agregados por la operación. Las estadísticas de optimización también contienen las estadísticas de ordenación Z, el número de lotes y las particiones optimizadas.

También puede compactar archivos pequeños automáticamente mediante la compactación automática. Consulte Compactación automática de Delta Lake en Azure Databricks.

¿Con qué frecuencia debo ejecutar OPTIMIZE?

Cuando se elige la frecuencia con la que se ejecuta OPTIMIZE, se generan concesiones entre rendimiento y costo. Para mejorar el rendimiento de las consultas del usuario final, ejecute OPTIMIZE con más frecuencia. Esto incurrirá en un costo mayor debido al aumento del uso de recursos. Para optimizar el costo, ejecútelo con menos frecuencia.

Databricks recomienda empezar por ejecutar OPTIMIZE diariamente y, a continuación, ajustar la frecuencia para equilibrar el costo y las ventajas del rendimiento.

¿Cuál es el mejor tipo de instancia en la que ejecutar OPTIMIZE (empaquetado en contenedores y ordenación Z)?

Ambas son operaciones que consumen mucha CPU y que generan grandes cantidades de codificación y descodificación de Parquet.

Databricks recomienda los tipos de instancia optimizados para proceso. OPTIMIZE también se beneficia de los discos SSD adjuntos.