Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La OPTIMIZE commande réécrit les fichiers de données pour améliorer la disposition des données pour les tables Delta Lake et Apache Iceberg. Pour les tables avec clustering liquide activé, OPTIMIZE réécrit les fichiers de données afin de regrouper les données par clé de clustering liquide. Pour les tables avec des partitions définies, le compactage de fichiers et la disposition des données sont effectués dans les partitions.
L’optimisation prédictive exécute automatiquement OPTIMIZE sur les tables managées par Unity Catalog. Databricks recommande d’activer l’optimisation prédictive pour toutes les tables managées par Unity Catalog afin de simplifier la maintenance des données et de réduire les coûts de stockage. Consultez Optimisation prédictive pour les tables managées Unity Catalog.
Les tables Delta Lake sans clustering liquide peuvent éventuellement inclure une ZORDER BY clause pour améliorer le clustering de données lors de la réécriture. Les tables Apache Iceberg utilisent des stratégies de clustering et de tri au lieu de ZORDER. Databricks recommande d’utiliser le clustering liquide plutôt que des partitions, ZORDER, ou d’autres approches de disposition des données.
Voir OPTIMIZE.
Important
Dans Databricks Runtime 16.0 et versions ultérieures, vous pouvez utiliser OPTIMIZE FULL pour forcer le reclustering pour les tables avec clustering liquide activé. Voir Force reclustering.
Exemples de syntaxe
Pour déclencher le compactage, exécutez la commande OPTIMIZE :
SQL
OPTIMIZE table_name
Python
L’API DeltaTable Python est spécifique à Delta Lake.
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Scala
L’API Scala DeltaTable est spécifique à Delta Lake.
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Si vous avez une grande quantité de données et que vous souhaitez uniquement optimiser un sous-ensemble, spécifiez un prédicat de partition facultatif à l’aide WHEREde :
SQL
OPTIMIZE table_name WHERE date >= '2022-11-18'
Python
L’API DeltaTable Python est spécifique à Delta Lake.
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Scala
L’API Scala DeltaTable est spécifique à Delta Lake.
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Tenez compte des informations suivantes pour l’empaquetage des compartiments :
- L’optimisation de l’empaquetage bin est idempotent, ce qui signifie que si elle est exécutée deux fois sur le même jeu de données, la deuxième exécution n’a aucun effet.
- Bin-packing vise à produire des fichiers de données équilibrés de manière uniforme en termes de taille de stockage, mais pas nécessairement en fonction du nombre de tuples par fichier. Toutefois, les deux mesures sont souvent corrélées.
Les lecteurs des tables Delta Lake utilisent l’isolation des captures instantanées, ce qui signifie qu’elles ne sont pas interrompues lorsque OPTIMIZE les fichiers inutiles sont supprimés du journal des transactions. Comme OPTIMIZE n’apporte aucune modification aux données de la table, une lecture effectuée avant et après un OPTIMIZE donne le même résultat. L’exécution OPTIMIZE sur une table qui est une source de diffusion en continu n’affecte pas les flux actuels ou futurs avec cette table en tant que source.
OPTIMIZE retourne les statistiques de fichier (min, Max, total, etc.) pour les fichiers supprimés et les fichiers ajoutés par l’opération. L'optimisation des statistiques contient également les statistiques de Z-Ordering, le nombre de lots et les partitions optimisées.
Vous pouvez également compacter automatiquement des fichiers de petite taille à l’aide de la compaction automatique. Voir Compactage automatique.
Fréquence recommandée à exécuter OPTIMIZE
Activez l’optimisation prédictive pour les tables managées par Unity Catalog afin de vous assurer que OPTIMIZE s’exécute automatiquement lorsque cela est rentable.
Lorsque vous choisissez la fréquence à exécuter OPTIMIZE, il existe un compromis entre les performances et les coûts. Pour de meilleures performances de requête de l’utilisateur final, exécutez OPTIMIZE plus souvent. Cela entraîne un coût plus élevé en raison de l’augmentation de l’utilisation des ressources. Pour optimiser les coûts, exécutez-le moins souvent.
Databricks vous recommande de commencer par exécuter OPTIMIZE quotidiennement, puis d’ajuster la fréquence pour trouver un compromis entre les coûts et les performances.
Types d’instances recommandés pour OPTIMIZE
Les deux opérations sont très gourmandes en CPU et impliquent de gros volumes de décodage et d’encodage de données Parquet.
Databricks recommande les types d’instance optimisés pour le calcul.
OPTIMIZE bénéficie également des disques SSD attachés.