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 queDELETE
. VACUUM
: après de nombreuses suppressions, utilisezVACUUM
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.