Partager via


Nettoyer et valider des données avec le traitement par lots ou par flux

Le nettoyage et la validation des données sont essentiels pour garantir la qualité des ressources de données dans un lakehouse. Cet article décrit les offres de produits Azure Databricks conçues pour promouvoir la qualité des données et fournit des recommandations pour définir une logique métier dans le but d’implémenter des règles personnalisées.

Application du schéma sur Azure Databricks

Delta Lake fournit une sémantique pour appliquer des vérifications de schéma et de contrainte lors de l’écriture, ce qui garantit la qualité des données pour les tables d’un lakehouse.

L’application du schéma garantit que les données écrites dans une table adhèrent à un schéma prédéfini. Les règles de validation du schéma varient selon l’opération. Consultez Application du schéma.

Pour gérer l’évolution du schéma, Delta fournit des mécanismes permettant de modifier le schéma et de faire évoluer les tables. Il est important de bien réfléchir avant d’utiliser l’évolution du schéma afin d’éviter la suppression de champs ou l’échec des pipelines. Pour obtenir des informations sur la mise à jour manuelle ou automatique des schémas, consultez Mettre à jour le schéma de table Delta Lake.

Contraintes de table

Les contraintes peuvent prendre la forme de contraintes de clé primaire et de clé étrangère (informationnelles) ou de contraintes appliquées. Consultez la clause ADD CONSTRAINT.

Les contraintes de table sur Azure Databricks sont soit appliquées, soit informationnelles.

Les contraintes appliquées incluent les contraintes NOT NULL et CHECK.

Les contraintes informationnelles incluent les contraintes de clé primaire et de clé étrangère.

Consultez Contraintes sur Azure Databricks.

Gérer les valeurs null ou manquantes

Vous pouvez appliquer la contrainte NOT NULL à des tables Delta. Vous pouvez uniquement l’activer sur une table existante si aucun enregistrement existant dans la colonne n’est null. Ainsi, les nouveaux enregistrements avec des valeurs null ne sont pas insérés dans la table.

Application des modèles

Vous pouvez utiliser des expressions régulières (regex) pour appliquer des modèles attendus dans un champ de données. Cela est particulièrement utile lorsque vous traitez des données textuelles qui doivent respecter des formats ou des modèles spécifiques.

Pour appliquer un modèle à l’aide de regex, vous pouvez utiliser les fonctions REGEXP ou RLIKE dans SQL. Ces fonctions vous permettent de faire correspondre un champ de données à un modèle regex spécifié.

Voici un exemple d'utilisation de la contrainte CHECK avec regex pour l'application des modèles dans SQL :

CREATE TABLE table_name (
  column_name STRING CHECK (column_name REGEXP '^[A-Za-z0-9]+$')
);

Application de valeurs

Vous pouvez utiliser des contraintes pour appliquer des plages de valeurs aux colonnes d’une table. De cette façon, seules les valeurs valides appartenant à la plage spécifiée sont autorisées à être insérées ou mises à jour.

Pour appliquer une contrainte de plage de valeurs, vous pouvez utiliser la contrainte CHECK dans SQL. La contrainte CHECK vous permet de définir une condition qui doit être vraie pour chaque ligne de la table.

Voici un exemple d’utilisation de la CHECK contrainte pour appliquer une plage de valeurs sur une colonne :

CREATE TABLE table_name (
  column_name INT CHECK (column_name >= 0 AND column_name <= 100)
);

Définissez et configurez les attentes à l’aide de pipelines déclaratifs Spark Lakeflow.

Les pipelines déclaratifs Spark Lakeflow vous permettent de définir des attentes lors de la déclaration de vues matérialisées ou de tables en streaming. Vous pouvez choisir de configurer des attentes pour recevoir des notifications en cas de violation, supprimer des enregistrements non conformes ou faire échouer des charges de travail en fonction des violations. Voir Gérer la qualité des données avec les attentes de pipeline.

Analyse des données

Azure Databricks fournit des services de monitoring de la qualité des données qui vous permettent de monitorer les propriétés statistiques et la qualité des données dans toutes les tables de votre compte. Consultez le profilage des données.

Caster les types de données

Lors de l’insertion ou de la mise à jour de données dans une table, Azure Databricks caste les types de données lorsqu’il est possible de le faire en toute sécurité sans perdre d'informations.

Pour plus d’informations sur les comportements de cast, consultez les articles suivants :

Logique métier personnalisée

Vous pouvez utiliser des filtres et des clauses WHERE pour définir une logique personnalisée qui met en quarantaine les enregistrements incorrects et empêche leur propagation aux tables en aval. Les clauses CASE WHEN ... OTHERWISE vous permettent de définir une logique conditionnelle pour appliquer correctement la logique métier aux enregistrements qui violent les attentes de manière prévisible.

DECLARE current_time = now()

INSERT INTO silver_table
  SELECT * FROM bronze_table
  WHERE event_timestamp <= current_time AND quantity >= 0;

INSERT INTO quarantine_table
  SELECT * FROM bronze_table
  WHERE event_timestamp > current_time OR quantity < 0;

Remarque

Databricks vous recommande de toujours traiter les données filtrées sous la forme d’une opération d’écriture distincte, en particulier lors de l’utilisation de Structured Streaming. L’utilisation de .foreachBatch pour écrire dans plusieurs tables peut entraîner des résultats incohérents.

Par exemple, vous pouvez avoir un système en amont qui ne peut pas encoder NULL des valeurs, et donc la valeur de remplacement -1 est utilisée pour représenter les données manquantes. Au lieu d’écrire une logique personnalisée pour toutes les requêtes en aval dans Azure Databricks afin d’ignorer les enregistrements contenant -1, vous pouvez utiliser une instruction case when pour remplacer dynamiquement ces enregistrements en tant que transformation.

INSERT INTO silver_table
  SELECT
    * EXCEPT weight,
    CASE
      WHEN weight = -1 THEN NULL
      ELSE weight
    END AS weight
  FROM bronze_table;