Retour aux Articles
Sep 23, 2024
5 min de lecture

Suppression de données dans les tables Delta : Guide complet

Delta Lake offre des mécanismes puissants et fiables pour supprimer des données dans les tables Delta, tout en garantissant la cohérence et l’intégrité des données. Cet article présente les différentes méthodes de suppression disponibles (SQL et API Delta), avec des exemples concrets et des recommandations.

Méthodes de suppression de données

1. Utiliser les requêtes SQL DELETE

La méthode la plus directe consiste à utiliser la commande SQL DELETE, bien connue des utilisateurs SQL.

Syntaxe :

DELETE FROM nom_table WHERE condition;

Exemple (PySpark) :

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("DeltaDeleteExample").getOrCreate()

# Suppression dans la table Delta nommée 'users'
spark.sql("DELETE FROM users WHERE age < 18")

Exemple (Scala) :

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder().appName("DeltaDeleteExample").getOrCreate()

spark.sql("DELETE FROM users WHERE age < 18")

Cette requête supprime toutes les lignes de la table users dont l’âge est inférieur à 18.

2. Utiliser l’API Delta

Pour un contrôle plus fin, notamment dans un pipeline, l’API Delta permet des suppressions conditionnelles programmatiques.

Exemple (PySpark) :

from delta.tables import DeltaTable
from pyspark.sql import SparkSession
from pyspark.sql.functions import expr

spark = SparkSession.builder.appName("DeltaDeleteAPIExample").getOrCreate()

delta_table = DeltaTable.forPath(spark, "/chemin/vers/la/table")

# Suppression avec une condition
delta_table.delete(condition=expr("age < 18"))

# Ou en passant une chaîne de condition SQL
delta_table.delete("age < 18")

Exemple (Scala) :

import io.delta.tables._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.expr

val spark = SparkSession.builder().appName("DeltaDeleteAPIExample").getOrCreate()

val deltaTable = DeltaTable.forPath(spark, "/chemin/vers/la/table")

deltaTable.delete(condition = expr("age < 18"))
deltaTable.delete("age < 18")

Ces exemples produisent le même résultat que la commande SQL, avec plus de flexibilité dans une application Spark.

3. Supprimer des partitions ou sous-ensembles

Si la table Delta est partitionnée, vous pouvez cibler des partitions spécifiques pour optimiser la suppression.

Exemple (PySpark) :

from delta.tables import DeltaTable

spark = SparkSession.builder.appName("DeltaPartitionedDelete").getOrCreate()

delta_table = DeltaTable.forPath(spark, "/chemin/vers/table/partitionnee")

# Supprimer les données de la partition 'USA'
delta_table.delete("country = 'USA'")

Exemple (Scala) :

import io.delta.tables._
import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder().appName("DeltaPartitionedDelete").getOrCreate()

val deltaTable = DeltaTable.forPath(spark, "/chemin/vers/table/partitionnee")

deltaTable.delete("country = 'USA'")

Cette méthode est bien plus performante que de filtrer l’ensemble de la table si seule une partition est concernée.

Options et configurations

Suppressions conditionnelles

Les clauses WHERE en SQL ou les expressions conditionnelles dans l’API permettent de cibler précisément les lignes à supprimer.

Ciblage de partitions

Inclure les colonnes de partition dans la condition améliore considérablement les performances des suppressions.

Optimiser les performances de suppression

  • Partitionnement : un bon partitionnement réduit la quantité de données scannée.
  • Filtres précis : utilisez des clauses WHERE sélectives.
  • Petites suppressions fréquentes : envisagez MERGE pour de meilleures performances que DELETE.
  • VACUUM : après de nombreuses suppressions, utilisez VACUUM pour libérer de l’espace disque.
    ⚠️ Attention : VACUUM supprime définitivement les versions anciennes après le délai de rétention (7 jours par défaut).

Bonnes pratiques

Cohérence et atomicité

Delta Lake garantit que les suppressions sont atomiques : soit toutes les lignes sont supprimées, soit aucune. Cela assure une forte cohérence.

Optimisation des performances

  • Évitez les scans complets : structurez vos tables pour profiter du partitionnement et filtrez efficacement.
  • Z-Ordering : si vous filtrez fréquemment sur certaines colonnes, le Z-ordering peut accélérer les suppressions.

Gestion des suppressions volumineuses

  • Par étapes : pour de très grandes suppressions, divisez en lots plus petits.
  • Surveillance : surveillez les ressources (CPU, mémoire, disque) lors des suppressions lourdes.

Historique de table et Time Travel

Les suppressions sont journalisées dans le log de transactions. Cela signifie qu’il est possible de restaurer les données supprimées via Time Travel. Pour les données sensibles, combinez avec VACUUM si nécessaire.

Gestion des erreurs et dépannage

  • Syntaxe incorrecte : vérifiez vos expressions SQL/API.
  • Permissions : assurez-vous d’avoir les droits d’écriture sur la table Delta.
  • Conflits de concurrence : si d’autres processus écrivent en même temps, des conflits peuvent survenir. Delta utilise un contrôle optimiste, vous devrez peut-être relancer l’opération.
  • Problèmes de performance : en cas de lenteur, analysez le plan d’exécution dans Spark UI. Reconsidérez partitionnement et filtres.
  • Erreurs liées à VACUUM : vérifiez qu’aucun processus n’accède aux anciennes versions des données, et ajustez la période de rétention si nécessaire.

Suppression dans les tables gérées vs. externes

Le processus de suppression est identique pour les deux types de tables. La différence concerne la gestion du cycle de vie :

  • Tables gérées : supprimer la table supprime les données et les métadonnées.
  • Tables externes : supprimer la table ne supprime que les métadonnées ; les fichiers restent dans le stockage externe.

Conclusion

Supprimer des données dans une table Delta est une opération puissante qui nécessite attention et rigueur. En maîtrisant les méthodes disponibles (SQL, API), les techniques d’optimisation et les bonnes pratiques, vous assurerez la fiabilité de vos données tout en maintenant de hautes performances. Pensez toujours à la cohérence, à la gestion du cycle de vie des données, et à la sécurité des opérations.