Compactación de tablas delta

Los archivos de tabla delta se fragmentan con el tiempo. La fragmentación aumenta la sobrecarga de la operación de archivo, reduce la eficacia de la compresión y puede limitar el paralelismo del lector. La compactación vuelve a escribir muchos archivos pequeños en menos archivos de tamaño correcto para que Spark pueda leer y procesar datos de forma más eficaz.

El OPTIMIZE comando es la operación de compactación principal. Agrupa archivos pequeños en contenedores destinados a un tamaño de archivo ideal y, a continuación, los vuelve a escribir en almacenamiento.

Para orientación sobre estrategias de compactación entre cargas de trabajo en endpoints de analítica SQL, Power BI Direct Lake y Spark, véase Mantenimiento y optimización de tablas de carga cruzadas.

Métodos de compactación

Fabric ofrece varios enfoques para mantener tamaños óptimos de archivo en tablas Delta:

Comando OPTIMIZE

El OPTIMIZE comando es la operación fundamental para compactar tablas Delta. Vuelve a escribir archivos pequeños en archivos más grandes para mejorar el diseño de datos en tablas Delta.

OPTIMIZE dbo.table_name
Propiedad Description Valor predeterminado Configuración de sesión
minFileSize Los archivos que son más pequeños que este umbral se agrupan y se vuelven a escribir como archivos más grandes. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize Tamaño del archivo de destino generado por el OPTIMIZE comando . 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE es idempotente, pero un tamaño excesivo minFileSize puede aumentar la amplificación de escritura. Por ejemplo, con minFileSize establecido en 1 GB, un archivo de 900 MB podría volver a escribirse después de una pequeña escritura adicional. Para obtener instrucciones de administración automáticas de tamaño de archivo, consulte Tamaño de archivo de destino adaptable.

OPTIMIZE con Z-Order

Cuando se usa la ZORDER BY cláusula , OPTIMIZE vuelve a escribir los archivos activos para que las filas con valores similares se coloquen en los mismos archivos. El diseño colocado mejora la omisión de archivos para filtros selectivos. Utilice Z-Order cuando:

  • Las consultas filtran con frecuencia dos o más columnas juntas (por ejemplo, fecha + customer_id) y
  • Esos predicados son lo suficientemente selectivos como para que la omisión en el nivel de archivo reduzca el número de archivos examinados.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE con orden V

La VORDER cláusula da como resultado que los archivos estén asignados al alcance de la compactación con la optimización en orden V. Para más información sobre el orden V, consulte la documentación detallada.

OPTIMIZE dbo.table_name VORDER

Puedes combinar el orden Z y el orden V en un solo comando. Spark aplica las operaciones en este orden: compactación de contenedores → orden Z → orden V.

OPTIMIZE dbo.table_name ZORDER BY (column1, column2) VORDER

El comportamiento del orden V durante OPTIMIZE depende de cómo invoques el comando:

Invocación Comportamiento
OPTIMIZE table VORDER Fuerza el orden en V en archivos reescritos, independientemente de la sesión o la configuración de la tabla.
OPTIMIZE table (sin VORDER palabra clave) Hereda el comportamiento de V-order de TBLPROPERTIES("delta.parquet.vorder.enabled") si está establecido, de lo contrario vuelve a la configuración spark.sql.parquet.vorder.defaultde sesión .

OPTIMIZE con agrupación en clústeres líquidos

La agrupación en clústeres líquidos se especifica como opción de tabla; consulte Habilitación de la agrupación en clústeres líquidos para obtener más información. Cuando se habilita la agrupación en clústeres líquidos, OPTIMIZE realiza la reescritura física que aplica la directiva de agrupación en clústeres.

Importante

Los datos solo se agrupan cuando OPTIMIZE se ejecuta en tablas habilitadas para liquid clustering. Las operaciones de escritura normales NO agrupan los datos. Contar con una estrategia de compactación, como el uso de la compactación automática o la programación manual de trabajos de optimización, es fundamental para garantizar que se puedan aprovecharse las ventajas de los datos agrupados (es decir, mejorar la omisión de archivos Delta).

OPTIMIZE FULL

Standard OPTIMIZE no reagrupa archivos que ya se consideran agrupados. Cuando cambias las claves de clustering o el proveedor de clustering, los archivos existentes mantienen su diseño anterior, por lo que las nuevas consultas no se benefician de la estrategia actualizada.

OPTIMIZE FULL Obliga a un pase de reagrupamiento en toda la mesa. Reagrupa cada archivo—incluidos los que antes estaban agrupados con diferentes claves o con otro proveedor—de modo que toda la tabla refleje la última estrategia de agrupamiento.

Nota:

OPTIMIZE FULLestá disponible a partir de Fabric Spark runtime 2.0 (Delta 4.2).

Usa OPTIMIZE FULL cuando:

  • Cambia las columnas de agrupación en una tabla de agrupación líquida.
  • Migra una tabla entre plataformas o proveedores de clúster.
OPTIMIZE dbo.table_name FULL

Como OPTIMIZE FULL puede reescribir la mayor parte o la totalidad de una tabla grande, puede resultar considerablemente más costoso que una operación incremental OPTIMIZE normal. Ejecuta la técnica de forma deliberada, normalmente una vez después de cambiar la estrategia de agrupamiento, en lugar de como parte del mantenimiento rutinario.

Optimización rápida

Optimización rápida analiza inteligentemente los archivos de tabla Delta y omite las operaciones de compactación que probablemente no mejorarán significativamente el rendimiento.

En lugar de compactar los archivos de forma ciega cada vez que existan archivos pequeños, la optimización rápida evalúa si cada contenedor candidato (grupo de archivos pequeños) cumple los objetivos de compactación de procedimientos recomendados configurables. Fast Optimize solo ejecuta la compactación en un conjunto de archivos si al combinarlos es probable que alcancen su tamaño mínimo objetivo o si hay demasiados archivos pequeños. De lo contrario, omite ese grupo o reduce el número de archivos que compacta.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

La función Fast Optimize puede afinarse basándose en tus expectativas específicas de compactación.

Propiedad Description Valor predeterminado Configuración de sesión
minNumFiles Número de archivos pequeños que deben existir en un contenedor para que se realice la optimización si el contenedor no contiene suficientes datos estimados para generar un archivo compactado . 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Multiplicado por el tamaño mínimo de archivo de contexto optimizado para determinar la cantidad mínima de datos de archivo pequeños que deben existir en un contenedor para que el contenedor se incluya en el ámbito de compactación. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Nota:

El parquetCoefficient da como resultado que el tamaño objetivo de un bin sea mayor que el tamaño objetivo mínimo de archivo en el contexto de optimización. Este coeficiente tiene en cuenta la realidad de que combinar varios archivos parquet pequeños da como resultado una mejor compresión y, por tanto, menos datos que la suma de archivos pequeños. Aumente el valor para que la optimización rápida sea más conservadora al omitir intervalos, o reduzca el valor para permitir una omisión de intervalos más permisiva.

Cómo funciona

La optimización rápida presenta comprobaciones adicionales antes de compactar los contenedores. Para cada cubo candidato, la optimización rápida evalúa:

  • Cantidad estimada de datos sin procesar en el contenedor (suma de tamaños de archivo pequeños)
  • Ya sea que combinar los archivos pequeños se estime que producirá un archivo que cumpla con el tamaño mínimo de destino configurado.
  • Si el contenedor contiene al menos el número mínimo configurado de archivos pequeños

La optimización rápida evalúa cada contenedor de archivos pequeños y compacta solo los contenedores que probablemente alcancen el tamaño de destino mínimo o superen el número mínimo de archivos. Los contenedores que no alcanzan estos umbrales se pasan por alto o se compactan parcialmente. La omisión de contenedores poco óptimos reduce las reescrituras innecesarias, reduce la amplificación de escritura y hace que los trabajos OPTIMIZE sean más idempotentes.

Captura de pantalla en la que se muestra cómo se evalúa la optimización rápida si se compacta un contenedor.

Nota:

La implementación exacta está sujeta a una evolución a lo largo del tiempo.

La optimización rápida puede reducir los datos reescritos a lo largo de un ciclo de vida de la tabla Delta. Como se muestra en el diagrama siguiente, la optimización rápida omite los cubos poco óptimos, lo que da lugar a trabajos más rápidos y más idempotentes OPTIMIZE con menos amplificación de escritura.

Captura de pantalla que muestra la rapidez con la que la optimización da como resultado menos reescritura de datos a lo largo del tiempo.

Nota:

Solo con fines ilustrativos, los diagramas anteriores asumen que el tamaño del archivo escrito a partir de la compactación es la suma del tamaño de los archivos pequeños. También implica un parquetCoefficient de 1.

Limitaciones
  • No es aplicable a las operaciones de agrupación en clústeres líquidos y orden Z
  • La optimización rápida no modifica el comportamiento de la compactación automática

Destinos de compactación de nivel de archivo

Para evitar la recompilación de los datos que se consideraron previamente como compactados (lo suficientemente grandes) basándose en un cambio en los objetivos de tamaño mínimo y máximo de archivo, se puede habilitar spark.microsoft.delta.optimize.fileLevelTarget.enabled para evitar la recompilación de archivos que ya habían sido compactados. Cuando está habilitado, los archivos no se vuelven a compactar si anteriormente cumplían al menos la mitad del tamaño objetivo del archivo en el momento de la recompresión. El mantenimiento de destinos de nivel de archivo minimiza la amplificación de escritura a medida que cambia el tamaño de destino de compactación a lo largo del tiempo (por ejemplo, desde la evaluación del tamaño del archivo de destino adaptable y la configuración de un destino mayor). Si está habilitado, la etiqueta OPTIMIZE_TARGET_SIZE se agrega a nuevos archivos cuando se ejecuta OPTIMIZE o para cualquier operación de escritura si se establece la propiedad delta.targetFileSize o la tabla delta.targetFileSize.adaptive.

Nota:

Aunque no está habilitado de forma predeterminada, Microsoft recomienda habilitar destinos de compactación de nivel de archivo para limitar la posible amplificación de escritura.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Compactación automática

La compactación automática evalúa el estado de la partición después de cada operación de escritura. Cuando detecta una fragmentación excesiva de archivos (demasiados archivos pequeños) dentro de una partición, desencadena una operación sincrónica OPTIMIZE inmediatamente después de confirmar la escritura. Este enfoque controlado por el sistema de escritura para el mantenimiento de archivos es óptimo porque la compactación solo se ejecuta cuando se determina mediante programación que es beneficioso.

Habilitar en el nivel de sesión

Establezca spark.databricks.delta.autoCompact.enabled en el nivel de sesión para habilitar la compactación automática para las nuevas tablas creadas en esa sesión de Spark:

SET spark.databricks.delta.autoCompact.enabled = TRUE

Habilitar en el nivel de tabla

Establezca la propiedad de tabla delta.autoOptimize.autoCompact para habilitar la compactación automática en tablas específicas:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Use la opción delta.autoOptimize.autoCompact DataFrameWriter para habilitar la compactación automática al crear una tabla:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Habilite la misma propiedad de tabla en una tabla existente:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Reducción de la sobrecarga de evaluación

A partir del entorno de ejecución de Spark de Fabric 2.0 (Delta 4.1), puede habilitar el modo de compactación automática de onCheckpointOnly. De forma predeterminada, la compactación automática evalúa los metadatos de archivo después de cada operación de escritura para determinar si una tabla tiene demasiados archivos pequeños. Con onCheckpointOnly, la evaluación se aplaza para registrar operaciones de punto de comprobación (normalmente cada 10 confirmaciones). En el momento del punto de comprobación, la instantánea de tabla ya está totalmente reconstruyida, por lo que la evaluación lee los metadatos que ya están en memoria en lugar de requerir un examen adicional. La evaluación diferida reduce la sobrecarga en cada confirmación y aun así garantiza que las tablas se compactan periódicamente.

SET spark.microsoft.delta.autoCompact.onCheckpointOnly.enabled = TRUE