Utiliser le clustering liquide pour les tables
Le clustering fluide est une technique d'optimisation du Layout des données qui remplace le partitionnement de table et ZORDER. Il simplifie la gestion des tables et optimise les performances des queries en organisant automatiquement les données en fonction des clés de clustering.
Contrairement au partitionnement traditionnel, vous pouvez redéfinir les clés de clustering sans réécrire les données existantes. Ceci permet à votre Layout de données d'évoluer en fonction des besoins analytiques changeants. Le liquid clustering s'applique à la fois aux tables de streaming et aux vues matérialisées.
Le clustering liquide est généralement disponible pour les tables Delta Lake avec Databricks Runtime 15.4 LTS et versions supérieures, et en Aperçu Public pour les tables Apache Iceberg dans Databricks Runtime 16.4 LTS et versions supérieures. Databricks recommande d'utiliser la dernière version de Databricks Runtime pour des performances optimales.
Les tables Apache Iceberg v3 gérées prennent également en charge les vecteurs de suppression, le suivi des lignes, la concurrence au niveau des lignes et la mise en cluster liquide automatique. Ces fonctionnalités nécessitent Databricks Runtime 18.0 ou une version ultérieure. Voir Utiliser les fonctionnalités d'Apache Iceberg v3.
Quand utiliser le clustering fluide
Databricks recommande le clustering liquide pour toutes les nouvelles tables, y compris les tables de streaming et les vues matérialisées. Les scénarios suivants bénéficient particulièrement du clustering :
- Requêtes qui filtrent sur des colonnes à cardinalité élevée.
- Tables avec un fort décalage des données.
- Tables à croissance rapide qui nécessitent un effort de maintenance et d'ajustement.
- Tables avec des exigences d'écriture concurrentes.
- Tables avec des modèles d'accès variés ou modifiés.
- Tables où une clé de partition typique pourrait renvoyer des résultats de trop de partitions ou de trop peu de partitions.
Activer le clustering liquide
Vous pouvez activer le liquid clustering sur une table non partitionnée existante ou pendant la création de la table. Le clustering n'est pas compatible avec le partitionnement ou ZORDER. Databricks vous recommande de permettre à la plateforme de gérer toutes les Opérations de Layout et d'optimisation pour les données de votre table. Après avoir activé le liquid clustering, exécutez OPTIMIZE Jobs pour regrouper les données de manière incrémentielle. Consultez How to Trigger le clustering.
Créez des tables avec clustering
Pour activer le liquid clustering, ajoutez la phrase CLUSTER BY à une instruction de création de table, comme dans les exemples ci-dessous. Dans Databricks Runtime 14.3 LTS et versions ultérieures, vous pouvez utiliser les API DataFrame et l'API DeltaTable en Python ou Scala pour activer le liquid clustering pour les tables Delta Lake.
- SQL
- Python
- Scala
Pour créer une table vide avec des clusters :
CREATE TABLE table1 (col0 INT, col1 STRING) CLUSTER BY (col0);
Pour créer une table à partir de données existantes avec le clustering, CLUSTER BY doit apparaître après le nom de la table, et non dans la clause SELECT :
CREATE TABLE table2 CLUSTER BY (col0)
AS SELECT * FROM table1;
Pour copier une structure de table, y compris sa configuration de clustering :
CREATE TABLE table3 LIKE table1;
Pour créer une table vide avec clustering à l’aide de l’API DeltaTable :
(DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute())
Pour créer une table à partir d'un DataFrame existant :
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
Pour créer une table à l'aide de l'API DataFrameWriterV2 (disponible dans Databricks Runtime 14.2 et versions ultérieures) :
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Pour créer une table vide avec clustering à l’aide de l’API DeltaTable :
DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute()
Pour créer une table à partir d'un DataFrame existant :
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
Pour créer une table à l'aide de l'API DataFrameWriterV2 (disponible dans Databricks Runtime 14.2 et versions ultérieures) :
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Lorsque vous utilisez les APIs DataFrame pour définir des clés de clustering, vous ne pouvez spécifier des colonnes de clustering que lors de la création de tables ou lorsque vous utilisez le mode overwrite (comme avec les CREATE OR REPLACE TABLE opérations). Vous ne pouvez pas modifier les clés de clustering lors de l'utilisation du mode append.
Pour modifier les clés de clustering sur une table existante tout en ajoutant des données, utilisez les commandes SQL ALTER TABLE pour modifier la configuration de clustering séparément de vos opérations d'écriture de données. Voir Modifier les clés de clustering.
Dans Databricks Runtime 16.4 LTS et versions ultérieures, vous pouvez créer des tables avec le clustering liquide activé à l'aide des écritures Structured Streaming, comme dans les exemples suivants :
- SQL
- Python
- Scala
CREATE TABLE table1 (
col0 STRING,
col1 DATE,
col2 BIGINT
)
CLUSTER BY (col0, col1);
(spark.readStream.table("source_table")
.writeStream
.clusterBy("column_name")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
)
spark.readStream.table("source_table")
.writeStream
.clusterBy("column_name")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Les tables Delta Lake avec clustering liquide activé utilisent la version 7 d'écriture Delta et la version 3 de lecture. Les clients Delta qui ne prennent pas en charge ces protocoles ne peuvent pas lire ces tables. Vous ne pouvez pas rétrograder les versions de protocole de table. Consultez la compatibilité des fonctionnalités et les protocoles de Delta Lake.
Pour remplacer l'activation des fonctionnalités default, telles que les vecteurs de suppression, voir Remplacer l'activation des fonctionnalités default (facultatif).
Activer sur les tables existantes
Pour activer le clustering liquide sur une table Delta Lake non partitionnée existante, procédez comme suit :
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
Pour les tables Apache Iceberg gérées, tenez compte des éléments suivants :
- Pour les tables avec la spécification v2, vous devez désactiver explicitement les vecteurs de suppression et le suivi des lignes lors de l'activation du clustering liquide sur une table existante.
- Pour les tables avec la spécification v3, la désactivation de ces fonctionnalités n’est pas requise car les vecteurs de suppression et le suivi des lignes sont pris en charge. Consultez Utiliser les fonctionnalités Apache Iceberg v3.
Le comportement par default n'applique pas le clustering aux données précédemment écrites. Pour forcer le re-regroupement, utilisez OPTIMIZE FULL ou OPTIMIZE FULL WHERE <predicate>. Voir Forcer le re-regroupement.
Convertir une table partitionnée en liquid clustering
Dans Databricks Runtime 18.1 et versions ultérieures, pour convertir une table Delta Lake partitionnée existante en clustering liquide, utilisez REPLACE PARTITIONED BY WITH CLUSTER BY dans une instruction ALTER TABLE. La conversion minimise les temps d'arrêt des lecteurs et des rédacteurs et prend en charge les tables externes et gérées. Après conversion, la table prend en charge les lectures avec Databricks Runtime 13.3 LTS et versions ultérieures.
Pour les tables Iceberg gérées, la conversion n'est pas nécessaire, car ces tables utilisent les définitions de partition comme clés de clustering liquide. L'exécution de la commande de conversion entraîne une erreur.
Les avantages de convertir les tables partitionnées en clustering liquide comprennent :
- Améliorations des performances pour les tables qui souffrent d'une mauvaise omission de données ou de sur-partitionnement.
- Améliorations automatiques des performances, à l'aide de
CLUSTER BY AUTO, pour les tables avec des modèles de query fréquemment modifiés. - Les colonnes de clustering sont flexibles et simples à modifier, tandis que le partitionnement est rigide et difficile à modifier.
- Conflits d'écriture réduits car les tables avec clustering liquide permettent la concurrence au niveau des lignes. Consultez Simultanéité au niveau des lignes.
Syntaxe
ALTER TABLE <table_name>
REPLACE PARTITIONED BY WITH CLUSTER BY [( <clustering_columns> ) | AUTO]
La clause CLUSTER BY prend en charge les options suivantes :
( <clustering_columns> ): Spécifie les nouvelles colonnes de clustering. Databricks recommande de maintenir les nouvelles colonnes de clustering similaires aux colonnes de partition d'origine. L'utilisation de colonnes très différentes Trigger une opération de reclustering importante lors de la première exécutionOPTIMIZE.AUTO: utilise les colonnes de partition actuelles comme colonnes de clustering initiales et permet à l'optimisation prédictive de s'adapter au fil du temps. Disponible uniquement pour les tables gérées par Unity Catalog. Voir Clustering liquide automatique.- Aucune option spécifiée : utilise les colonnes de partition actuelles comme nouvelles colonnes de clustering.
Pour obtenir des conseils sur le choix des clés de clusters lors de la migration à partir de tables partitionnées, consultez Migration à partir du partitionnement ou de Z-order.
Exemples
Pour regrouper sur des colonnes différentes des partitions d'origine, comme pour une table partitionnée sur (year, month, day), effectuez les opérations suivantes :
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (day, id);
OPTIMIZE t1;
Pour bénéficier de la modification des colonnes de clustering, vous devez exécuter OPTIMIZE.
Pour utiliser le clustering liquide automatique et start avec les colonnes de partition actuelles, procédez comme suit :
ALTER TABLE t2 REPLACE PARTITIONED BY WITH CLUSTER BY AUTO;
Pour conserver les colonnes de partition actuelles comme colonnes de clustering, procédez comme suit :
ALTER TABLE t3 REPLACE PARTITIONED BY WITH CLUSTER BY;
Gérer les lectures et écritures simultanées pendant la conversion
Après la conversion, Databricks Runtime 13.3 LTS ou version supérieure est pris en charge pour les lectures et les écritures. Databricks recommande Databricks Runtime 15.4 LTS ou version supérieure pour les charges de travail qui lisent ou écrivent dans la table pendant la conversion.
Consultez le tableau suivant pour savoir comment gérer les charges de travail de lecture et d'écriture simultanées pendant la conversion :
Type de Workload | Lectures pendant la conversion | Écritures pendant la conversion |
|---|---|---|
Batch | Aucun temps d'arrêt. Toutes les versions de Databricks Runtime peuvent lire la table pendant la conversion. | Aucune interruption sur Databricks Runtime 15,4 et versions supérieures. Pour Databricks Runtime 15.3 et les versions antérieures, Databricks vous recommande de mettre en pause les charges de travail avant la conversion, puis de redémarrer les charges de travail une fois la conversion terminée. |
Streaming | Avec suivi du schéma et mappage des colonnes : Redémarrez le Stream sans perdre de commits. **Sans suivi de schéma ni mappage des colonnes** : le stream déclenche une exception. Redémarrez avec un nouvel emplacement de point de contrôle et une version start. Les commits ne sont pas perdus. | Redémarrez le Stream sans perdre aucun commits. |
Vérifier ou annuler une conversion
Pour confirmer la conversion, exécutez DESCRIBE EXTENDED pour voir les nouvelles colonnes de clustering. Exécutez DESCRIBE HISTORY pour voir une série de REORG opérations, une UPGRADE PROTOCOL opération et une REPLACE PARTITIONED BY WITH CLUSTER BY opération.
Pour annuler une conversion, utilisez RESTORE pour revenir à la version précédente. Alternativement, vous pouvez réécrire la table à l'aide de REPLACE TABLE ... PARTITIONED BY (...) AS SELECT * FROM ....
Pour annuler à l'aide de RESTORE, exécutez les commandes suivantes :
ALTER TABLE my_table CLUSTER BY NONE;
ALTER TABLE my_table UNSET TBLPROPERTIES ('delta.liquid.hierarchicalClusteringColumns');
RESTORE TABLE my_table TO VERSION AS OF <version_number_before_conversion>;
See RESTORE.
Convertir une table partitionnée par une colonne Timestamp
Pour convertir une table (t1) qui est partitionnée par une colonne de timestamp (timestamp_col) et utiliser la colonne de timestamp comme clé de clustering, vous devez définir des configurations supplémentaires :
SET spark.databricks.delta.liquidConversion.statsGeneration.enabled = false;
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (timestamp_col, id);
ANALYZE TABLE t1 COMPUTE DELTA STATISTICS;
Si vous tentez de convertir une colonne de partition Timestamp en colonne de clustering sans ces configurations, la commande génère une erreur :
ALTER TABLE REPLACE PARTITIONED BY WITH CLUSTER BY cannot auto-generate stats on table with column event_ts due to unsupported type: timestamp. Disable stats auto-generation by setting 'spark.databricks.delta.liquidConversion.statsGeneration.enabled' to 'false' and retry the command again. SQLSTATE: 42000
Limitations de conversion.
Les limitations suivantes s'appliquent à la commande de conversion REPLACE PARTITIONED BY WITH CLUSTER BY :
- Les tables de streaming et les vues matérialisées créées dans les Lakeflow Pipelines ne sont pas prises en charge. Pour utiliser le groupage liquide, vous devez mettre à jour la définition du pipeline pour utiliser
CLUSTER BYau lieu dePARTITIONED BY. - Les tables qui utilisent Delta Sharing avec le filtrage de partition ne sont pas prises en charge. Pour plus d'informations sur le filtrage de partition pour Delta Sharing, consultez Spécifier les partitions de table à partager.
Supprimez les clés de clustering
Pour supprimer les clés de clustering, utilisez la syntaxe suivante :
ALTER TABLE table_name CLUSTER BY NONE;
Choisir les clés de partitionnement
Choisissez les clés de clustering en fonction des colonnes les plus fréquemment utilisées dans les filtres de query. Les bonnes clés améliorent considérablement l'ignorance des données et les performances des query.
Databricks vous recommande d’utiliser le clustering liquide automatique pour sélectionner intelligemment les clés de clustering en fonction de vos modèles de query. Voir le clustering liquide automatique.
Consignes de sélection de clé
Lorsque vous spécifiez manuellement des clés de clustering, choisissez les colonnes en fonction des colonnes les plus fréquemment utilisées dans les filtres de query. Vous pouvez définir les clés de clustering dans n'importe quel ordre. Si deux colonnes sont fortement corrélées, vous n'avez besoin d'inclure qu'une seule d'entre elles comme clé de clustering.
Vous pouvez spécifier jusqu'à quatre clés de cluster . Pour les tables plus petites (moins de 10 To), l’utilisation de davantage de clés de clustering peut dégrader les performances lors du filtrage sur une seule colonne. Par exemple, le filtrage avec quatre clés est moins performant qu'avec deux clés. Cependant, à mesure que la taille de la table augmente, cette différence de performances devient négligeable pour les queries à colonne unique.
Les clés de clustering doivent être des colonnes pour lesquelles des statistiques ont été collectées. Par default, les tables Delta Lake collectent des statistiques pour les 32 premières colonnes. Voir spécifier les colonnes de statistiques.
Types de données pris en charge
Le partitionnement prend en charge ces types de données pour les clés de partitionnement :
- Date
- Horodatage
- TimestampNTZ (Databricks Runtime 14.3 LTS et versions supérieures).
- Chaîne
- Entier, Long, Court, Octet
- Float, Double, Décimal
Vous pouvez regrouper par un StructField en utilisant la notation par points, tel que CLUSTER BY (struct_col.field). Les champs de structure imbriqués sont pris en charge à n'importe quelle profondeur, tel que CLUSTER BY (struct_col.nested.field). Le type de données du champ doit être l'un des types pris en charge dans la liste précédente.
Vous ne pouvez regrouper par aucun des éléments suivants :
- Types complexes, tels que
StructType,MapTypeouArrayType MapTypeetArrayTypeéléments, tels quemap_col['key'],array_col[0]oumap_col.key.
Migration depuis le partitionnement ou Z-order
Databricks vous recommande d'utiliser la conversion automatique avec la commande REPLACE PARTITIONED BY WITH CLUSTER BY. Voir Convertir une table partitionnée en clustering liquide.
Si vous convertissez une table existante, tenez compte des recommandations suivantes :
Technique actuelle d'optimisation des données | Recommandation pour les clés de clustering |
|---|---|
Partitionnement de style Hive | Utilisez les colonnes de partition comme clés de clustering. |
Indexation Z-order | Utilisez les colonnes |
Partitionnement de type Hive et Z-order | Utilisez à la fois les colonnes de partition et les colonnes |
Colonnes générées pour réduire la cardinalité (par exemple, la date pour un timestamp) | Utilisez la colonne d'origine comme clé de clustering, et ne créez pas de colonne générée. |
Clustering liquide automatique
Dans Databricks Runtime 15,4 LTS et versions ultérieures, vous pouvez activer le clustering liquide automatique pour les tables Delta Lake gérées par Unity Catalog. Pour les tables Apache Iceberg v3 gérées par Unity Catalog, le clustering liquide automatique nécessite Databricks Runtime 18,0 et versions ultérieures. Le clustering liquide automatique permet à Databricks de choisir intelligemment les clés de clustering pour optimiser les performances des queries, en utilisant la clause CLUSTER BY AUTO.
Le clustering liquide automatique est également pris en charge pour les vues matérialisées et les tables de streaming, y compris les Lakeflow pipelines et les pipelines autonomes. Spécifiez CLUSTER BY AUTO dans votre définition de pipeline ou SQL.
Fonctionnement du liquid clustering automatique
Le clustering liquide automatique nécessite une optimisation prédictive pour la sélection automatique des clés et les opérations de clustering, et s'exécute de manière asynchrone. Consultez Optimisation prédictive pour les tables gérées par Unity Catalog.
Le clustering liquide automatique applique des optimisations intelligentes basées sur vos modèles d'utilisation :
- Analyse la charge de travail des requêtes : Databricks analyse la charge de travail historique des requêtes de la table et identifie les meilleures colonnes candidates pour le clustering.
- S'adapte aux changements : si vos modèles de query ou vos distributions de données changent au fil du temps, le clustering liquide automatique sélectionne de nouvelles clés pour optimiser les performances.
- Sélection axée sur les coûts : Databricks ne modifie les clés de clustering que lorsque les économies de coûts prévues grâce aux améliorations du saut de données dépassent le coût du clustering des données.
Le clustering liquide automatique pourrait ne pas sélectionner de clés pour les raisons suivantes :
- La table est trop petite pour bénéficier du clustering liquide.
- La table dispose déjà d’un schéma de clustering efficace, provenant soit de clés manuelles précédentes, soit d’un ordre d’insertion naturel qui correspond aux modèles de query.
- Le tableau n’a pas de query fréquentes.
- Vous n'utilisez pas Databricks Runtime 15.4 LTS ou une version ultérieure.
Vous pouvez appliquer le clustering liquide automatique à toutes les tables gérées par Unity Catalog, quelles que soient les caractéristiques des données et des query. Les heuristiques déterminent s'il est rentable de sélectionner des clés de clustering.
Compatibilité de la version de Databricks Runtime
Vous pouvez lire ou écrire des tables avec le clustering automatique activé à partir de toutes les versions de Databricks Runtime qui prennent en charge le clustering liquide. Cependant, la sélection intelligente de clés repose sur les métadonnées introduites dans Databricks Runtime 15,4 LTS.
Utilisez Databricks Runtime 15.4 LTS ou une version ultérieure pour vous assurer que les clés sélectionnées automatiquement bénéficient à toutes vos charges de travail et que ces charges de travail sont prises en compte lors de la sélection de nouvelles clés.
Activez ou désactivez le clustering liquide automatique
- SQL
- Python
Pour créer une table avec clustering liquide automatique :
CREATE OR REPLACE TABLE table1 (column01 int, column02 string) CLUSTER BY AUTO;
Pour activer le clustering liquide automatique sur une table existante, y compris les tables avec des clés spécifiées manuellement :
ALTER TABLE table1 CLUSTER BY AUTO;
Pour définir les indications de colonne de clustering initiales pour la sélection des clés, définissez les clés de clustering, puis activez le clustering automatique :
ALTER TABLE table1 CLUSTER BY (c1, c2);
ALTER TABLE table1 CLUSTER BY AUTO;
Alternativement, utilisez l'API Python pour définir des indicateurs en une seule opération.
Pour désactiver le clustering liquide automatique :
ALTER TABLE table1 CLUSTER BY NONE;
Pour désactiver le clustering liquide automatique et spécifier les colonnes de clustering :
ALTER TABLE table1 CLUSTER BY (column01, column02);
Si une table existante a le clustering liquide automatique activé, l'exécution de CREATE OR REPLACE table_name sans CLUSTER BY AUTO désactive le clustering automatique et ne préserve pas les colonnes de clustering. Pour préserver le clustering liquide automatique et toutes les colonnes précédemment sélectionnées, incluez CLUSTER BY AUTO dans l'instruction de remplacement. Avec CLUSTER BY AUTO, l'optimisation prédictive utilise la charge de travail de query historique pour la table afin d'identifier les meilleures clés de clustering.
L'API Python est disponible dans Databricks Runtime 16.4 et versions ultérieures. Vous ne pouvez utiliser Python que lors de la création ou du remplacement d'une table. Utilisez SQL pour modifier le statut clusterByAuto d'une table existante.
Pour créer une table avec clustering liquide automatique à l’aide de DataFrameWriter:
df = spark.read.table("table1")
df.write
.format("delta")
.option("clusterByAuto", "true")
.saveAsTable(...)
Pour définir des indicateurs de colonne de clusters initiaux pour la sélection de clés en utilisant DataFrameWriter:
df.write
.format("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.saveAsTable(...)
Pour créer une table avec clustering liquide automatique à l’aide de DataFrameWriterV2:
df.writeTo(...).using("delta")
.option("clusterByAuto", "true")
.create()
Pour définir des indicateurs de colonne de clusters initiaux pour la sélection de clés en utilisant DataFrameWriterV2:
df.writeTo(...).using("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.create()
Pour créer une table de streaming avec clustering liquide automatique :
spark.readStream.table("source_table")
.writeStream
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Pour définir des indicateurs de colonne de clustering initiaux pour la sélection de clés dans une table de streaming :
spark.readStream.table("source_table")
.writeStream
.clusterBy("column1", "column2")
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Lorsque vous utilisez .clusterBy pour les suggestions de sélection de clé de clusters avec .option('clusterByAuto', 'true'), le comportement est le suivant :
- Si cela configure le groupage liquide automatique pour la première fois, les colonnes de groupage sont définies sur les colonnes spécifiées dans
.clusterBy. - S'il s'agit d'une table existante avec le clustering liquide automatique activé, un indice
.clusterByn'est accepté qu'une seule fois. Par exemple, les colonnes spécifiées par.clusterByne sont définies que si la table n'a pas de colonnes de clustering définies.
Lors de l'utilisation des APIs de DataFrame, l'option clusterByAuto ne peut être définie que lors de l'utilisation du mode overwrite. Vous ne pouvez pas définir clusterByAuto lorsque vous utilisez le mode append. Cette restriction est la même que lors de la définition manuelle des colonnes de clusters. Vous pouvez uniquement configurer les paramètres de clustering pendant la création de table ou les opérations de remplacement en utilisant le mode overwrite.
En guise de solution de contournement, si vous souhaitez modifier l'état clusterByAuto sur une table existante lors de l'ajout de données, utilisez les commandes SQL ALTER TABLE pour modifier la configuration de clustering séparément de vos opérations d'écriture de données.
Vérifier si le regroupement automatique des clusters est activé
Pour vérifier si le clustering liquide automatique est activé pour une table, utilisez DESCRIBE TABLE ou SHOW TBLPROPERTIES.
Si le liquid clustering automatique est activé, la propriété clusterByAuto est définie sur true. La propriété clusteringColumns affiche les colonnes de clustering actuelles qui ont été sélectionnées automatiquement ou manuellement.
Limitations
Le clustering liquide automatique n'est pas disponible pour les tables Apache Iceberg v2 gérées. Il est pris en charge pour les tables Apache Iceberg v3 gérées dans Databricks Runtime 18.0 et versions ultérieures.
Écrire des données dans une table en cluster
Pour écrire dans une table Delta Lake clusterisée, vous devez utiliser un client d'écriture Delta qui prend en charge toutes les fonctionnalités de table du protocole d'écriture Delta utilisées par le liquid clustering. Pour écrire dans une table Iceberg clusterisée, vous pouvez utiliser l'API REST Catalog d'Iceberg de Unity Catalog. Sur Databricks, vous devez utiliser Databricks Runtime 13.3 LTS ou une version ultérieure.
Opérations qui prennent en charge le clustering lors de l'écriture
Les opérations de cluster sur écriture incluent les suivantes :
INSERT INTOOpérationsCTASetRTASinstructionsCOPY INTOdepuis le format Parquetspark.write.mode("append")
threshold de taille pour le clustering
Le clustering en écriture ne se Trigger que lorsque les données de la transaction atteignent un threshold de taille. Ces thresholds varient en fonction du nombre de colonnes de clustering et sont inférieurs pour les tables gérées par Unity Catalog que pour les autres tables Delta Lake.
Nombre de colonnes de clustering | Taille de threshold pour les tables gérées par Unity Catalog. | threshold size pour les autres tables Delta Lake |
|---|---|---|
1 | 64 Mo | 256 Mo |
2 | 256 Mo | 1 Go |
3 | 512 Mo | 2 Go |
4 | 1 Go | 4 Go |
Étant donné que toutes les opérations n'appliquent pas le clustering fluide, Databricks recommande d'exécuter fréquemment OPTIMIZE pour s'assurer que toutes les données sont efficacement clusterisées.
Charges de travail en streaming
Les charges de travail Structured Streaming prennent en charge le clustering à l'écriture lorsque vous définissez la configuration Spark spark.databricks.delta.liquid.eagerClustering.streaming.enabled sur true. Le clustering pour ces charges de travail ne Trigger que si au moins une des cinq dernières mises à jour de streaming dépasse un threshold de taille du tableau ci-dessus.
How to Trigger clustering
L'optimisation prédictive exécute automatiquement les commandes OPTIMIZE pour les tables activées. Consultez Optimisation prédictive pour les tables gérées par Unity Catalog. Lorsque vous utilisez l'optimisation prédictive, Databricks recommande de désactiver tous les Jobs OPTIMIZE planifiés.
To Trigger clustering, vous devez utiliser Databricks Runtime 13.3 LTS ou version ultérieure. Databricks recommande Databricks Runtime 17.3 LTS et versions ultérieures pour des performances OPTIMIZE plus rapides sur les grandes tables. Utilisez la commande OPTIMIZE sur votre table :
OPTIMIZE table_name;
Le clustering fluide est incrémentiel , ce qui signifie que OPTIMIZE ne réécrit les données que si nécessaire pour s'adapter aux données qui nécessitent un clustering. OPTIMIZE ne réécrit pas les fichiers de données avec des clés de clustering qui ne correspondent pas aux données clusterisées. Consultez Forcer le reclassement.
Si vous n’utilisez pas l’optimisation prédictive, Databricks recommande de planifier régulièrement des OPTIMIZE jobs pour clusteriser les données. Pour les tables subissant de nombreuses mises à jour ou insertions, Databricks recommande de planifier un OPTIMIZE job toutes les une ou deux heures. Le clustering liquide étant incrémentiel, la plupart des OPTIMIZE jobs pour les tables clusterisées s’exécutent rapidement.
Forcer la reclusterisation
Dans Databricks Runtime 16.4 LTS et versions ultérieures, vous pouvez forcer le re-clustering de tous les enregistrements d'une table avec la syntaxe suivante :
OPTIMIZE table_name FULL;
L'exécution de OPTIMIZE FULL reclustérise toutes les données existantes si nécessaire. Pour les grandes tables qui n’ont pas été préalablement mises en cluster sur les clés spécifiées, cette opération peut prendre des heures.
Exécutez OPTIMIZE FULL lorsque vous activez le clustering pour la première fois ou que vous modifiez les clés de clustering. Si vous avez exécuté précédemment OPTIMIZE FULL et qu'il n'y a eu aucun changement dans les clés de clustering, OPTIMIZE FULL s'exécute de la même manière que OPTIMIZE. Dans ce scénario, OPTIMIZE utilise une approche incrémentielle et réécrit uniquement les fichiers qui n'ont pas été compactés précédemment. Assurez-vous toujours d’utiliser OPTIMIZE FULL pour que la data Layout reflète les clés de clustering actuelles.
Recluster partiel
À partir de Databricks Runtime 18,1 et versions ultérieures, vous pouvez forcer le reclustering pour un sous-ensemble d'enregistrements à l'aide de OPTIMIZE FULL WHERE <predicate>. Un fichier est inclus si une partie de sa plage chevauche le prédicat. See parameter.
OPTIMIZE events FULL WHERE event_date >= '2025-01-01';
Lire les données d'une table en cluster
Vous pouvez lire les données d’une table Delta Lake clusterisée à l’aide de n’importe quel client Delta Lake qui prend en charge la lecture des vecteurs de suppression. Grâce à l’API Iceberg REST Catalog, vous pouvez lire les données d’une table Iceberg clusterisée. Le clustering liquide améliore les performances des query grâce au saut de données automatique lors du filtrage sur les clés de clustering.
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
Gérer les clés de clustering
Voir comment une table est groupée
Vous pouvez utiliser les commandes DESCRIBE pour voir les clés de clustering d'une table, comme dans les exemples suivants :
DESCRIBE TABLE table_name;
DESCRIBE DETAIL table_name;
Modifier les clés de clusters
Vous pouvez modifier les clés de clusters d’une table à tout moment en exécutant une commande ALTER TABLE, comme dans l’exemple suivant :
ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);
Lorsque vous modifiez les clés de clustering, les OPTIMIZE et opérations d'écriture ultérieures utilisent la nouvelle approche de clustering, mais les données existantes ne sont pas réécrites. Pour réécrire les données existantes avec les clés de partitionnement mises à jour, consultez Forcer le repartitionnement.
Vous pouvez également désactiver le clustering en définissant les clés à NONE, comme dans l'exemple suivant :
ALTER TABLE table_name CLUSTER BY NONE;
La définition des clés de cluster sur NONE ne réécrit pas les données en clusters, mais empêche les futures OPTIMIZE Opérations d'utiliser les clés de clustering.
Utilisez le clustering liquide à partir d'un moteur externe
Vous pouvez activer le clustering liquide sur les tables Iceberg gérées à partir de moteurs Iceberg externes. Pour activer le clustering liquide, spécifiez les colonnes de partition lors de la création d'une table. Unity Catalog interprète les partitions comme des clés de clustering. Par exemple, exécutez la commande ci-dessous dans OSS Spark :
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY c1;
Pour désactiver le clustering fluide :
ALTER TABLE main.schema.icebergTable DROP PARTITION FIELD c2;
Pour modifier les clés de clustering à l’aide de l’évolution des partitions Iceberg :
ALTER TABLE main.schema.icebergTable ADD PARTITION FIELD c2;
Si vous spécifiez une partition à l’aide d’une transformation de compartiment, Unity Catalog supprime l’expression et utilise la colonne comme clé de clusters :
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY (bucket(c1, 10));
Compatibilité pour les tables avec clustering liquide
Le clustering liquide utilise les fonctionnalités de table Delta Lake qui nécessitent des versions spécifiques de Databricks Runtime pour la lecture et l'écriture. Les tables créées avec le clustering liquide dans Databricks Runtime 14.3 LTS et versions ultérieures utilisent le checkpoint V2 par default. Vous pouvez lire et écrire des tables avec le checkpoint V2 dans Databricks Runtime 13.3 LTS et versions ultérieures. Consultez Checkpoint V2.
Pour prendre en charge les lecteurs utilisant Databricks Runtime 12.2 LTS à 13.2, désactivez le point de contrôle V2 et rétrogradez le protocole de table. Consultez Passer à la version classique.
Remplacer l'activation de la fonctionnalité default (facultatif)
Vous pouvez remplacer l’activation default des fonctionnalités de table Delta Lake lors de l’activation du clustering liquide. Cela empêche les mises à niveau des protocoles de lecture et d'écriture associés à ces fonctionnalités de table. Vous devez disposer d'une table existante pour suivre les étapes suivantes :
-
Utilisez
ALTER TABLEpour définir la propriété de la table qui désactive une ou plusieurs fonctionnalités. Par exemple, pour désactiver les vecteurs de suppression, exécutez ce qui suit :SQLALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false); -
Activez le clustering liquide sur la table en exécutant la commande suivante :
SQLALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
Le tableau suivant contient des informations sur les fonctionnalités Delta que vous pouvez remplacer et sur la façon dont l'activation affecte la compatibilité avec les versions de Databricks Runtime :
Fonctionnalité Delta | Compatibilité du Runtime | Propriété de remplacement de l'activation. | Effets sur le clustering liquide s'il est désactivé. |
|---|---|---|---|
Vecteurs de suppression | Les lectures et écritures nécessitent Databricks Runtime 12,2 LTS ou une version supérieure. |
| La désactivation des vecteurs de suppression désactive également la simultanéité au niveau des lignes, ce qui rend les transactions et les opérations de clustering plus susceptibles d'entrer en conflit. Consultez Simultanéité au niveau des lignes.
|
Suivi des lignes | Les écritures nécessitent Databricks Runtime 13.3 LTS ou une version ultérieure. Peut être lu depuis n'importe quelle version de Databricks Runtime. |
| La désactivation du suivi des lignes désactive également la concurrence au niveau des lignes, rendant les transactions et les opérations de clustering plus susceptibles d'entrer en conflit. Consultez Simultanéité au niveau des lignes. |
Point de contrôle V2 | Les lectures et les écritures nécessitent Databricks Runtime 13.3 LTS ou une version ultérieure. |
| Aucun effet sur le comportement du clustering fluide. Consultez Point de contrôle V2. |
Limitations
- Databricks Runtime 15.1 et versions antérieures : Le clustering à l'écriture ne prend pas en charge les queries sources qui incluent des filtres, des jointures ou des agrégations.
- **Databricks Runtime 15.4 LTS et versions antérieures** : vous ne pouvez pas créer de table avec le clustering liquide activé à l’aide d’une écriture Structured Streaming. Vous pouvez utiliser Structured Streaming pour écrire des données dans une table existante avec le clustering liquide activé.
- Apache Iceberg v2 : la concurrence au niveau des lignes n'est pas prise en charge sur les tables Apache Iceberg v2 gérées, car les vecteurs de suppression et le suivi des lignes ne sont pas pris en charge.
- La concurrence au niveau des lignes est prise en charge sur les tables gérées Apache Iceberg v3 car la spécification v3 prend en charge les vecteurs de suppression et le suivi des lignes. Consultez Utiliser les fonctionnalités Apache Iceberg v3.