Compartir a través de


Optimización del diseño del archivo de datos

La optimización predictiva ejecuta automáticamente OPTIMIZE en tablas administradas de Unity Catalog. Databricks recomienda habilitar la optimización predictiva para todas las tablas administradas de Unity Catalog para simplificar el mantenimiento de datos y reducir los costos de almacenamiento. Consulte Optimización predictiva para Delta Lake.

El comando OPTIMIZE vuelve a escribir archivos de datos para mejorar el diseño de datos de las tablas Delta. En el caso de las tablas con clústeres líquidos habilitados, OPTIMIZE reescribe los archivos de datos para agrupar los datos mediante claves de agrupación en clústeres líquidos. En el caso de las tablas con particiones definidas, la compactación de archivos y el diseño de datos se realizan dentro de las particiones.

Las tablas sin clústeres líquidos pueden incluir opcionalmente una cláusula ZORDER BY para mejorar la agrupación en clústeres de datos en la reescritura. Databricks recomienda usar clústeres líquidos en lugar de particiones, ZORDER u otros enfoques de diseño de datos.

Consulte OPTIMIZE.

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?

Habilite la optimización predictiva para las tablas administradas de Unity Catalog para asegurarse de que OPTIMIZE se ejecuta automáticamente cuando es rentable.

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.