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.
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 :
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
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 :
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE
Par exemple, pour rétablir une colonne vers le classement binaire default :
--
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 :
- Mettre à jour les statistiques d'omission de fichiers pour la colonne :
ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
- Si votre table utilise le clustering liquide, réécrivez la Layout du clustering :
OPTIMIZE FULL my_table
- 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 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 :
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY
Ensuite, supprimez la fonctionnalité de table :
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
collationsactivé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
collationsreviennent à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é
MAPne peut pas être une chaîne de caractères collationnée. Seules les valeursMAPprennent en charge le classement