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.

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 tablas Delta nuevas. 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()

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

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 basadas en filtros de consulta usados habitualmente. Las claves de agrupación en clústeres se pueden definir en cualquier orden. Si hay dos columnas correlacionadas, solo tiene que agregar una de ellas como clave de agrupación en clústeres.

Puede especificar hasta 4 columnas como claves de agrupación en clústeres. Solo puede especificar columnas con estadísticas recopiladas para las 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.

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.
  • No se puede crear una tabla con la agrupación en clústeres líquidos habilitada 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.