meilleures pratiques recommandées.Best practices

Cet article décrit les meilleures pratiques lors de l’utilisation de Delta Lake.This article describes best practices when using Delta Lake.

Fournir des indicateurs d’emplacement des donnéesProvide data location hints

Si vous pensez qu’une colonne est couramment utilisée dans les prédicats de requête et si cette colonne a une cardinalité élevée (autrement dit, un grand nombre de valeurs distinctes), utilisez Z-ORDER BY .If you expect a column to be commonly used in query predicates and if that column has high cardinality (that is, a large number of distinct values), then use Z-ORDER BY. Delta Lake dispose automatiquement des données dans les fichiers en fonction des valeurs de colonne et utilise les informations de mise en page pour ignorer les données inutiles lors de l’interrogation.Delta Lake automatically lays out the data in the files based on the column values and use the layout information to skip irrelevant data while querying.

Pour plus d’informations, consultez ordre de plan (clustering multidimensionnel).For details, see Z-Ordering (multi-dimensional clustering).

Choisir la colonne de partition appropriéeChoose the right partition column

Vous pouvez partitionner une table Delta par colonne.You can partition a Delta table by a column. La colonne de partition la plus couramment utilisée est date .The most commonly used partition column is date. Pour choisir la colonne à partitionner, suivez les deux règles suivantes :Follow these two rules of thumb for deciding on what column to partition by:

  • Si la cardinalité d’une colonne est très élevée, n’utilisez pas cette colonne pour le partitionnement.If the cardinality of a column will be very high, do not use that column for partitioning. Par exemple, si vous partitionnez par une colonne userId et s’il peut y avoir 1 million d’ID utilisateur distincts, il s’agit d’une stratégie de partitionnement incorrecte.For example, if you partition by a column userId and if there can be 1M distinct user IDs, then that is a bad partitioning strategy.
  • Quantité de données dans chaque partition : vous pouvez partitionner par une colonne si vous vous attendez à ce que les données de cette partition aient au moins 1 Go.Amount of data in each partition: You can partition by a column if you expect data in that partition to be at least 1 GB.

Compacter des fichiers Compact files

Si vous écrivez en permanence des données dans une table Delta, il accumulera un grand nombre de fichiers, en particulier si vous ajoutez des données par petits lots.If you continuously write data to a Delta table, it will over time accumulate a large number of files, especially if you add data in small batches. Cela peut avoir un effet néfaste sur l’efficacité des lectures de table, et cela peut également affecter les performances de votre système de fichiers.This can have an adverse effect on the efficiency of table reads, and it can also affect the performance of your file system. Idéalement, un grand nombre de petits fichiers doivent être réécrits dans un plus petit nombre de fichiers volumineux de manière régulière.Ideally, a large number of small files should be rewritten into a smaller number of larger files on a regular basis. Cela porte le nom de compactage.This is known as compaction.

Vous pouvez compacter une table à l’aide de la commande optimize .You can compact a table using the OPTIMIZE command.

Remplacer le contenu ou le schéma d' une table Replace the content or schema of a table

Il se peut que vous souhaitiez remplacer une table Delta.Sometimes you may want to replace a Delta table. Par exemple :For example:

  • Vous découvrez que les données de la table sont incorrectes et que vous souhaitez remplacer le contenu.You discover the data in the table is incorrect and want to replace the content.
  • Vous souhaitez réécrire la table entière pour effectuer des modifications de schéma incompatibles (supprimer les colonnes ou modifier les types de colonne).You want to rewrite the whole table to do incompatible schema changes (drop columns or change column types).

Vous pouvez supprimer l’intégralité du répertoire d’une table Delta et créer une table sur le même chemin d’accès, ce qui n’est pas recommandé car :While you can delete the entire directory of a Delta table and create a new table on the same path, it’s not recommended because:

  • La suppression d’un répertoire n’est pas efficace.Deleting a directory is not efficient. La suppression d’un répertoire contenant des fichiers très volumineux peut prendre des heures, voire des jours.A directory containing very large files can take hours or even days to delete.
  • Vous perdez tout le contenu des fichiers supprimés ; Il est difficile de récupérer si vous supprimez la mauvaise table.You lose all of content in the deleted files; it’s hard to recover if you delete the wrong table.
  • La suppression du répertoire n’est pas atomique.The directory deletion is not atomic. Lors de la suppression de la table, une requête simultanée qui lit la table peut échouer ou afficher une table partielle.While you are deleting the table a concurrent query reading the table can fail or see a partial table.

Si vous n’avez pas besoin de modifier le schéma de la table, vous pouvez supprimer des données d’une table Delta et insérer vos nouvelles données, ou mettre à jour la table pour corriger les valeurs incorrectes.If you don’t need to change the table schema, you can delete data from a Delta table and insert your new data, or update the table to fix the incorrect values.

Si vous souhaitez modifier le schéma de la table, vous pouvez remplacer la table entière de manière atomique.If you want to change the table schema, you can replace the whole table atomically. Par exemple :For example:

PythonPython

dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .partitionBy(<your-partition-columns>) \
  .saveAsTable("<your-table>") # Managed table
dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .option("path", "<your-table-path>") \
  .partitionBy(<your-partition-columns>) \
  .saveAsTable("<your-table>") # External table

SQLSQL

REPLACE TABLE <your-table> USING DELTA PARTITIONED BY (<your-partition-columns>) AS SELECT ... -- Managed table
REPLACE TABLE <your-table> USING DELTA PARTITIONED BY (<your-partition-columns>) LOCATION "<your-table-path>" AS SELECT ... -- External table

ScalaScala

dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .partitionBy(<your-partition-columns>)
  .saveAsTable("<your-table>") // Managed table
dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .option("path", "<your-table-path>")
  .partitionBy(<your-partition-columns>)
  .saveAsTable("<your-table>") // External table

Cette approche présente plusieurs avantages :There are multiple benefits with this approach:

  • Le remplacement d’une table est beaucoup plus rapide, car elle n’a pas besoin de répertorier le répertoire de manière récursive ou de supprimer des fichiers.Overwriting a table is much faster because it doesn’t need to list the directory recursively or delete any files.
  • L’ancienne version de la table existe toujours.The old version of the table still exists. Si vous supprimez la table incorrecte, vous pouvez facilement récupérer les anciennes données à l’aide de l' heure de voyage.If you delete the wrong table you can easily retrieve the old data using Time Travel.
  • Il s’agit d’une opération atomique.It’s an atomic operation. Les requêtes simultanées peuvent toujours lire la table pendant que vous supprimez la table.Concurrent queries can still read the table while you are deleting the table.
  • En raison des garanties de transaction ACID Delta Lake, si le remplacement de la table échoue, la table sera à son état précédent.Because of Delta Lake ACID transaction guarantees, if overwriting the table fails, the table will be in its previous state.

En outre, si vous souhaitez supprimer les anciens fichiers pour économiser le coût de stockage après avoir écrasé la table, vous pouvez utiliser la dépression pour les supprimer.In addition, if you want to delete old files to save storage cost after overwriting the table, you can use VACUUM to delete them. Elle est optimisée pour la suppression de fichiers et généralement plus rapide que la suppression de l’annuaire entier.It’s optimized for file deletion and usually faster than deleting the entire directory.