Partager via


Prise en charge du tri pour Delta Lake

Vous pouvez spécifier des classements sur des champs de chaîne dans les tables Delta pour contrôler le comportement des comparaisons de chaînes et du tri, comme l’activation de la correspondance sans respect de la casse ou de l’ordre sensible aux paramètres régionaux. Cela nécessite Databricks Runtime 16.4 LTS et versions ultérieures.

Pour obtenir une explication complète des types de classement, des conventions d’affectation de noms et des règles de précédence, consultez Classement.

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

Important

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

Créer une table avec classement

Vous pouvez spécifier le classement au niveau de la colonne lors de la création d’une table. Le classement peut être appliqué aux colonnes de chaîne de niveau supérieur et aux champs de chaîne à l’intérieur des types imbriqués :

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 le classement. Seules les valeurs MAP prennent en charge les chaînes ordonnées.

Modifier le classement sur une colonne existante

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

-- Set a column to case-insensitive collation
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE

-- Revert a column to the default binary collation
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Mettre à jour les statistiques et la disposition des données après modification de l'interclassement

La modification du classement d’une colonne ne réécrit pas les données existantes ni ne met à jour les statistiques. Les requêtes retournent des résultats corrects sous le nouveau classement immédiatement, mais le saut de fichiers et le clustering peuvent être moins efficaces jusqu’à ce que vous procédiez comme suit :

  1. Mettez à jour les statistiques de saut de fichiers pour la colonne :
   ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
  1. Si votre table utilise le regroupement liquide, réécrivez la disposition de ce regroupement :
   OPTIMIZE FULL my_table
  1. Si votre table utilise ZORDER, désactivez l’optimisation incrémentielle et réécrivez tous les fichiers :
   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 peut réduire les performances des requêtes sur les données historiques jusqu’à la réécriture complète suivante.

Le classement est toujours respecté par Azure Databricks dans les résultats de requête.

Désactiver le tri d’une table

Pour supprimer la fonctionnalité de table de collationnement, restaurez d'abord chaque colonne collationnée sur UTF8_BINARY:

-- Repeat for each collated column
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Supprimez ensuite la fonctionnalité de table :

ALTER TABLE my_table DROP FEATURE collations

Pour plus d’informations, consultez Supprimer une fonctionnalité de table Delta Lake et rétrograder le protocole de table .

Évolution du schéma et classement

Lorsque l’évolution du schéma ajoute ou fusionne des colonnes qui ont un classement spécifié, les règles suivantes s’appliquent :

  • Si une colonne source existe déjà dans la table cible, le classement de la table cible pour cette colonne est conservé. L’interclassement de la colonne source est ignoré.
  • Si une colonne source est nouvelle et a un classement spécifié, la table cible adopte ce classement pour la nouvelle colonne.
  • Si la table cible n’a pas encore activé la collations fonctionnalité de table, l’ajout d’une colonne compilée l’active automatiquement.

Limites

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

Compatibilité et interopérabilité :

  • Les lecteurs externes qui ne reconnaissent pas la fonction de table collations repassent à UTF8_BINARY, ce qui peut produire des ordres de tri incorrects ou des comparaisons incorrectes.
  • Delta Sharing ne prend pas en charge le partage de partitions individuelles sur les colonnes d'interclassement non par défaut. Partagez la table à la place.
  • UniForm n’est pas pris en charge pour les tables avec classement.
  • Les tables delta créées en externe avec un classement non reconnu par Databricks Runtime lèvent une exception lorsqu’elles sont interrogées.
  • Les API Delta Lake OSS pour Scala ou Python ne prennent pas en charge le classement. Utilisez des API Spark SQL ou DataFrame.

Restrictions relatives aux requêtes et aux fonctionnalités :

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