Aller au contenu principal

Prise en charge des classements pour Delta Lake

Sur Databricks Runtime 16.4 LTS et versions ultérieures, spécifiez des classements sur les champs de chaîne dans les tables Delta Lake pour contrôler les comparaisons de chaînes et le comportement de tri au niveau des colonnes, tels que l'activation de la correspondance insensible à la casse ou le tri sensible à la locale.

Pour une explication complète des types de classement, des conventions de nommage et des règles de précédence, consultez Classement.

Par default, Delta Lake définit le classement des champs de chaîne sur UTF8_BINARY.

important

L'activation du classement ajoute la fonctionnalité de table de writer collations à votre table Delta Lake, ce qui affecte la compatibilité avec les lecteurs externes et les autres fonctionnalités de la plateforme. Consultez la section Limitations avant d'activer le classement sur les tables de production.

Créez une table avec interclassement

Vous pouvez spécifier le classement au niveau de la colonne lors de la création d'une nouvelle table. Le classement peut être appliqué aux colonnes de chaînes de niveau supérieur et aux champs de chaînes dans les types imbriqués :

SQL
CREATE TABLE catalog.schema.my_table (
id BIGINT,
name STRING COLLATE UTF8_LCASE,
metadata STRUCT<label: STRING COLLATE UNICODE>,
tags ARRAY<STRING COLLATE UTF8_LCASE>,
properties MAP<STRING, STRING COLLATE UTF8_LCASE>
) USING delta
remarque

MAP les clés ne peuvent pas utiliser de classement. Seules les valeurs MAP prennent en charge les chaînes collationnées.

Modifier le classement sur une colonne existante

Vous pouvez modifier le classement d'une colonne existante à l'aide de ALTER TABLE.

Par exemple, pour définir une colonne sur le classement insensible à la casse :

SQL
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE

Par exemple, pour rétablir une colonne vers le classement binaire default :

SQL
--
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Mettre à jour les statistiques et le layout des données après modification du classement

Le changement du classement d'une colonne ne réécrit pas les données existantes ou ne met pas à jour les statistiques. Les query renvoient des résultats corrects immédiatement sous le nouveau classement, mais le saut de fichiers et le clustering pourraient être moins efficaces tant que vous n'avez pas effectué les étapes suivantes :

  1. Mettre à jour les statistiques d'omission de fichiers pour la colonne :
SQL
   ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
  1. Si votre table utilise le clustering liquide, réécrivez la Layout du clustering :
SQL
   OPTIMIZE FULL my_table
  1. Si votre table utilise ZORDER, désactivez l'optimisation incrémentielle et réécrivez tous les fichiers :
SQL
   SET spark.databricks.optimize.incremental = false;
OPTIMIZE my_table ZORDER BY zorder_column;

Ignorer ces étapes n'entraîne pas de résultats incorrects, mais pourrait réduire les performances des requêtes sur les données historiques jusqu'à la prochaine réécriture complète.

Le classement est toujours respecté par Databricks dans les résultats de query.

Désactiver le classement pour une table.

Pour supprimer la fonctionnalité de table de classement, redéfinissez chaque colonne classée sur UTF8_BINARY.

D'abord, exécutez cette commande pour chaque colonne collationnée :

SQL
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Ensuite, supprimez la fonctionnalité de table :

SQL
ALTER TABLE my_table DROP FEATURE collations

Voir Supprimer une fonctionnalité de table Delta Lake et rétrograder le protocole de table pour plus de détails.

Évolution des schémas et interclassement

Lorsque l'évolution des schémas ajoute ou Merge des colonnes pour lesquelles un classement est spécifié, les règles suivantes s'appliquent :

  • Si une colonne source existe déjà dans la table cible, le classement de cette colonne dans la table cible est préservé. Le classement de la colonne source est ignoré.
  • Si une colonne source est nouvelle et qu'un classement est spécifié, la table cible adopte ce classement pour la nouvelle colonne.
  • Si la table cible n'a pas déjà la fonctionnalité de table collations activée, l'ajout d'une colonne interclassée l'active automatiquement.

Limitations

Les limitations suivantes s'appliquent aux tables Delta Lake avec classement activé :

Compatibilité et interopérabilité :

  • Les lecteurs externes qui ne reconnaissent pas la fonctionnalité de table collations reviennent à UTF8_BINARY, ce qui pourrait produire des ordres de tri ou des comparaisons incorrects.
  • OpenSharing ne prend pas en charge le partage de partitions individuelles sur des colonnes de classement non par défaut. Partager la table plutôt.
  • UniForm n’est pas pris en charge pour les tables avec classement.
  • Les tables Delta Lake créées en externe avec un classement non reconnu par Databricks Runtime génèrent une exception lors de la query.
  • Les APIs OSS Delta Lake pour Scala ou Python ne prennent pas en charge le classement. Utiliser Spark SQL ou les APIs DataFrame.

Requête et restrictions de fonctionnalités :

  • Les colonnes triées ne peuvent pas être utilisées dans les contraintes CHECK.
  • Les colonnes collationnées ne peuvent pas être référencées dans les expressions de colonne générées
  • Les colonnes collationnées ne peuvent pas être utilisées avec les index de filtre de Bloom (déconseillé)
  • Les colonnes collationnées ne peuvent pas être référencées dans les requêtes avec état de Structured Streaming (agrégations, jointures, déduplication)
  • Une clé MAP ne peut pas être une chaîne de caractères collationnée. Seules les valeurs MAP prennent en charge le classement

Ressources supplémentaires