Compartir a través de


Uso de clústeres líquidos para tablas Delta

La agrupación en clústeres líquidos de Delta Lake reemplaza a la creación de particiones de tablas y ZORDER para simplificar las decisiones de diseño de datos y optimizar el rendimiento de las consultas. La agrupación dinámica en clústeres proporciona flexibilidad para redefinir las claves de agrupación en clústeres sin tener que volver a escribir los datos existentes, lo que permite que el diseño de los datos evolucione junto con las necesidades analíticas a lo largo del tiempo. La agrupación en clústeres líquidos se aplica tanto a las tablas de streaming como a las vistas materializadas.

Importante

Databricks recomienda usar Databricks Runtime 15.2 y versiones posteriores para todas las tablas con clústeres líquidos habilitados. La compatibilidad con la versión preliminar pública con limitaciones está disponible en Databricks Runtime 13.3 LTS y versiones posteriores.

Nota:

Las tablas con clústeres líquidos habilitados admiten la simultaneidad de nivel de fila en Databricks Runtime 13.3 LTS y versiones posteriores. La simultaneidad de nivel de fila está disponible con carácter general en Databricks Runtime 14.2 y versiones posteriores para todas las tablas con vectores de eliminación habilitados. Consulte Niveles de aislamiento y conflictos de escritura en Azure Databricks.

¿Para qué se usa la agrupación en clústeres líquidos?

Databricks recomienda la agrupación en clústeres líquidos para todas las nuevas tablas Delta, que incluye tablas de streaming (ST) y vistas materializadas (VMV). A continuación se muestran ejemplos de escenarios que se benefician de la agrupación en clústeres:

  • Tablas que suelen filtrarse por columnas de cardinalidad alta.
  • Tablas con asimetría significativa en la distribución de datos.
  • Tablas que crecen rápidamente y requieren trabajo de mantenimiento y ajuste.
  • Tablas con requisitos de escritura simultánea.
  • Tablas con patrones de acceso que cambian con el tiempo.
  • Tablas en las que una clave de partición típica podría dejar la tabla con demasiadas particiones o muy pocas.

Habilitación de la agrupación en clústeres líquidos

Puede habilitar agrupación dinámica en clústeres en una tabla existente o durante la creación de la tabla. La agrupación en clústeres no es compatible con la creación de particiones o ZORDER, y requiere que use Azure Databricks administre todas las operaciones de diseño y optimización de los datos de la tabla. Después de habilitar la agrupación dinámica en clústeres, ejecute trabajos OPTIMIZE como de costumbre para los datos de clúster incremental. Consulte Cómo desencadenar la agrupación en clústeres.

Para habilitar la agrupación en clústeres líquidos, agregue la frase CLUSTER BY a una instrucción de creación de tablas, como en los ejemplos siguientes:

Nota:

En Databricks Runtime 14.2 y versiones posteriores, puede usar las API de DataFrame y la API DeltaTable en Python o Scala para habilitar la agrupación en clústeres líquidos.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

En Databricks Runtime 16.0 y versiones posteriores, puede crear tablas con clústeres líquidos habilitados mediante escrituras de Structured Streaming, como en los ejemplos siguientes:

Python

(spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")
)

Scala

spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

Advertencia

Las tablas creadas con la agrupación en clústeres líquidos habilitada tienen habilitadas numerosas características de tablas Delta cuando se crean, y emplean la versión 7 de escritura Delta y la versión 3 de lectura. Puede invalidar la habilitación de algunas de estas características. Consulte Invalidación de la habilitación de características predeterminada (opcional).

Las versiones de protocolo de tabla no se pueden cambiar a una versión anterior, y las tablas con la agrupación en clústeres habilitada no son legibles por los clientes de Delta Lake que no admiten todas las características de tablas de protocolo de lectura Delta habilitadas. Consulte ¿Cómo administra Azure Databricks la compatibilidad de características de Delta Lake?.

Puede habilitar la agrupación en clústeres líquidos en una tabla Delta sin particiones existente mediante la sintaxis siguiente:

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

Importante

El comportamiento predeterminado no aplica la agrupación en clústeres a los datos escritos anteriormente. Para forzar el reagrupamiento de todos los registros, debes usar OPTIMIZE FULL. Consulta Reagrupación forzada para todos los registros.

Invalidar la habilitación de características predeterminada (opcional)

Puede invalidar el comportamiento predeterminado que habilita las características de la tabla Delta durante la habilitación de la agrupación en clústeres líquidos. Esto impide que se actualicen los protocolos de lectura y escritura asociados a esas características de tabla. Debe tener una tabla existente para completar los pasos siguientes:

  1. Use ALTER TABLE para establecer la propiedad table que deshabilita una o varias características. Por ejemplo, para deshabilitar los vectores de eliminación, ejecute lo siguiente:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Para habilitar la agrupación en clústeres líquidos en la tabla, ejecute lo siguiente:

    ALTER TABLE <table_name>
    CLUSTER BY (<clustering_columns>)
    

En la tabla siguiente se proporciona información sobre las características delta que puede invalidar y cómo afecta la habilitación a la compatibilidad con las versiones de Databricks Runtime.

Característica delta Compatibilidad en tiempo de ejecución Propiedad para invalidar la habilitación Impacto de la deshabilitación en clústeres líquidos
Vectores de eliminación Las lecturas y escrituras requieren Databricks Runtime 12.2 LTS y versiones posteriores. 'delta.enableDeletionVectors' = false La simultaneidad de nivel de fila está deshabilitada, lo que hace que las transacciones y las operaciones de agrupación en clústeres tengan más probabilidades de entrar en conflicto. Vea Conflictos de escritura con simultaneidad de nivel de fila.

DELETE, comandos MERGE, y UPDATE pueden ejecutarse más lentamente.
Seguimiento de filas Las escrituras requieren Databricks Runtime 13.3 LTS y versiones posteriores. Se puede leer desde cualquier versión de Databricks Runtime. 'delta.enableRowTracking' = false La simultaneidad de nivel de fila está deshabilitada, lo que hace que las transacciones y las operaciones de agrupación en clústeres tengan más probabilidades de entrar en conflicto. Vea Conflictos de escritura con simultaneidad de nivel de fila.
Puntos de control V2 Las lecturas y escrituras requieren Databricks Runtime 13.3 LTS y versiones posteriores. 'delta.checkpointPolicy' = 'classic' No afecta al comportamiento de la agrupación en clústeres líquidos.

Elección de claves de agrupación en clústeres

Databricks recomienda elegir claves de agrupación en clústeres en función de las columnas que se usan con más frecuencia en los filtros de consulta. Las claves de agrupación en clústeres se pueden definir en cualquier orden. Si dos columnas están muy correlacionadas, solo debe incluir una de ellas como clave de agrupación en clústeres.

Puede especificar hasta cuatro claves de agrupación en clústeres. En el caso de las tablas más pequeñas (en menos de 10 TB), el uso de más claves de agrupación en clústeres (por ejemplo, cuatro) puede degradar el rendimiento al filtrar en una sola columna en comparación con el uso de menos claves de agrupación en clústeres (por ejemplo, dos). Sin embargo, a medida que aumenta el tamaño de tabla, la diferencia de rendimiento con el uso de más claves de agrupación en clústeres para las consultas de una sola columna se convierte en insignificante.

Solo puede especificar columnas que tengan estadísticas recopiladas como claves de agrupación en clústeres. De forma predeterminada, las primeras 32 columnas de una tabla Delta tienen estadísticas recopiladas. Vea Especificación de columnas de estadísticas delta.

La agrupación en clústeres admite los siguientes tipos de datos para las claves de agrupación en clústeres:

  • Date
  • Marca de tiempo
  • TimestampNTZ (requiere Databricks Runtime 14.3 LTS o superior)
  • Cadena
  • Entero
  • Largo
  • Short
  • Flotante
  • Double
  • Decimal
  • Byte

Si va a convertir una tabla existente, tenga en cuenta las siguientes recomendaciones:

Técnica de optimización de datos actual Recomendación para las claves de agrupación en clústeres
Creación de particiones de estilo de Hive Usar columnas de partición como claves de agrupación en clústeres.
Indexación de orden Z Usar las columnas ZORDER BY como claves de agrupación en clústeres.
Creación de particiones de estilo de Hive y orden Z Usar las columnas de partición y las columnas ZORDER BY como claves de agrupación en clústeres.
Columnas generadas para reducir la cardinalidad (por ejemplo, fecha para una marca de tiempo) Usar la columna original como clave de agrupación en clústeres y no crear una columna generada.

Escritura de datos en una tabla agrupada

Debe usar un cliente de escritura Delta que admita todas las características de tablas de protocolo de escritura Delta usadas por la agrupación en clústeres líquidos. En Azure Databricks, es preciso usar Databricks Runtime 13.3 LTS o cualquier versión posterior.

Entre las operaciones que realizan agrupaciones en la escritura se incluyen las siguientes:

  • INSERT INTO operaciones
  • Instrucciones CTAS y RTAS
  • COPY INTO del formato Parquet
  • spark.write.mode("append")

Las escrituras de Structured Streaming nunca desencadenan la agrupación en clústeres en escritura. Se aplican limitaciones adicionales. Consulte Limitaciones.

La agrupación en clústeres solo se desencadena cuando los datos de la transacción cumplen un umbral de tamaño. Estos umbrales varían según el número de columnas de agrupación en clústeres y son inferiores para las tablas administradas de Unity Catalog que otras tablas Delta.

Número de columnas de agrupación en clústeres Tamaño del umbral para las tablas administradas de Unity Catalog Tamaño del umbral para otras tablas Delta
1 64 MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4 GB

Dado que no todas las operaciones se aplican a la agrupación en clústeres líquidos, Databricks recomienda ejecutar con frecuencia OPTIMIZE para asegurarse de que todos los datos se agrupen de forma eficaz.

Cómo desencadenar la agrupación en clústeres

La optimización predictiva ejecuta automáticamente comandos OPTIMIZE para las tablas habilitadas. Consulte Optimización predictiva para tablas administradas de Unity Catalog.

Para desencadenar la agrupación en clústeres, se deben usar Databricks Runtime 13.3 LTS o cualquier versión superior. Use el comando OPTIMIZE en la tabla, como en el ejemplo siguiente:

OPTIMIZE table_name;

La agrupación en clústeres líquidos es incremental, lo que significa que los datos solo se reescriben cuando es necesario para dar cabida a los datos que se deben agrupar. No se reescriben los archivos de datos con claves de agrupación en clústeres que no coinciden con los datos que se van a agrupar.

Para obtener el mejor rendimiento, Databricks recomienda programar trabajos OPTIMIZE periódicos para agrupar los datos. En el caso de tablas que experimentan muchas actualizaciones o inserciones, Databricks recomienda programar un trabajo OPTIMIZE cada una o dos horas. Dado que la agrupación en clústeres líquidos es incremental, la mayoría de los trabajos OPTIMIZE de las tablas agrupadas se ejecutan rápidamente.

Reagrupación forzada para todos los registros

En Databricks Runtime 16.0 y versiones posteriores, puede forzar la reclusión de todos los registros de una tabla con la sintaxis siguiente:

OPTIMIZE table_name FULL;

Importante

La ejecución de OPTIMIZE FULL vuelve a agrupar todos los datos existentes según sea necesario. En el caso de las tablas grandes que no se han agrupado previamente en las claves especificadas, esta operación puede tardar horas.

Ejecute OPTIMIZE FULL al habilitar la agrupación en clústeres por primera vez o cambie las claves de agrupación en clústeres. Si ha ejecutado previamente OPTIMIZE FULL y no ha habido ningún cambio en las claves de agrupación en clústeres, OPTIMIZE FULL ejecuta lo mismo que OPTIMIZE. Use siempre OPTIMIZE FULL para asegurarse de que el diseño de datos refleje las claves de agrupación en clústeres actuales.

Lectura de los datos de una tabla agrupada

Puede leer datos de una tabla agrupada usando cualquier cliente de Delta Lake que admita la lectura de vectores de eliminación. Para obtener los mejores resultados de la consulta, incluya claves de agrupación en clústeres en los filtros de consulta, como en el ejemplo siguiente:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Cambio de las claves de agrupación en clústeres

Puede cambiar las claves de agrupación en clústeres de una tabla en cualquier momento ejecutando un comando ALTER TABLE, como en el ejemplo siguiente:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

Al cambiar las claves de agrupación en clústeres, las operaciones OPTIMIZE y de escritura subsiguientes usan el nuevo enfoque de agrupación en clústeres, pero no se reescriben los datos existentes.

También puede desactivar la agrupación en clústeres estableciendo las claves en NONE, como en el ejemplo siguiente:

ALTER TABLE table_name CLUSTER BY NONE;

Al establecer las claves del clúster en NONE, no se reescriben los datos que ya se han agrupado, pero se impide que las operaciones OPTIMIZE futuras usen claves de agrupación en clústeres.

Ver cómo se agrupa la tabla

Puede usar comandos DESCRIBE para ver las claves de agrupación en clústeres de una tabla, como en los ejemplos siguientes:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Compatibilidad con tablas con agrupación en clústeres líquidos

Las tablas creadas con agrupación en clústeres líquidos tanto en Databricks Runtime 14.1 como en las versiones posteriores usan puntos de control v2 de forma predeterminada. Tanto en Databricks Runtime 13.3 LTS como en las versiones posteriores, puede leer y escribir tablas con puntos de control v2.

Puede deshabilitar los puntos de control v2 y degradar los protocolos de tabla para leer tablas con clústeres líquidos en Databricks Runtime 12.2 LTS y versiones posteriores. Consulte Eliminación de características de tablas Delta.

Limitaciones

Existen las siguientes limitaciones:

  • En Databricks Runtime 15.1 y versiones posteriores, la agrupación en clústeres en escritura no admite consultas de origen que incluyan filtros, combinaciones o agregaciones.
  • Las cargas de trabajo de Structured Streaming no admiten la agrupación en clústeres en escritura.
  • En Databricks Runtime 15.4 LTS y versiones anteriores, no se puede crear una tabla con clústeres líquidos habilitados mediante una escritura de Structured Streaming. Puede usar Structured Streaming para escribir datos en una tabla existente con la agrupación en clústeres líquidos habilitada.