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.
Azure Databricks valide la qualité des données en appliquant le schéma en écriture pour les tables Delta Lake. L’application du schéma ne s’applique pas aux tables utilisant des formats non Delta, tels que des fichiers CSV ou JSON dans le stockage cloud.
Validation du schéma pour les opérations INSERT
Azure Databricks applique les règles suivantes lors de l’insertion de données dans une table :
- Toutes les colonnes insérées doivent exister dans la table cible.
- Tous les types de données de colonne doivent correspondre aux types de données de colonne dans la table cible.
Note
Azure Databricks tente de convertir en toute sécurité les types de données de colonne pour qu’ils correspondent à la table cible.
Exemples INSERT
Les exemples suivants écrivent dans une table Delta Lake gérée nommée enforce_demo. Pour la créer, exécutez ce qui suit :
CREATE OR REPLACE TABLE main.default.enforce_demo (id INT, name STRING, amount BIGINT);
L’élément suivant INSERT échoue, car unknown_column n’existe pas dans enforce_demo. Azure Databricks renvoie une UNRESOLVED_COLUMN.WITH_SUGGESTION erreur (SQLSTATE 42703) qui suggère les noms valides des colonnes :
INSERT INTO main.default.enforce_demo (id, unknown_column) VALUES (1, 'value');
L’opération suivante INSERT réussit. Azure Databricks convertit en toute sécurité l’entier 42 en type BIGINT de la colonne amount :
INSERT INTO main.default.enforce_demo (id, amount) VALUES (1, 42);
Validation du schéma pour les opérations MERGE
Azure Databricks applique les règles suivantes lors de l’insertion ou de la mise à jour de données dans le cadre d’une MERGE opération :
- Si le type de données de l’instruction source ne correspond pas à la colonne cible,
MERGEtente de convertir en toute sécurité les types de données de colonne pour qu’ils correspondent à la table cible. - Les colonnes cibles d’une action
UPDATEouINSERTdoivent exister dans la table cible. - Lorsque vous utilisez
INSERT *ouUPDATE SET *:- Le jeu de données source doit avoir toutes les colonnes présentes dans la table cible.
- L’application de la contrainte ignore les colonnes du jeu de données source qui ne sont pas présentes dans la table cible.
Exemples MERGE
Les exemples suivants réutilisent la enforce_demo table de la section précédente, ainsi qu’une table source nommée enforce_source qui comporte une colonne supplémentaire. Pour créer la table source, exécutez ce qui suit :
CREATE OR REPLACE TABLE main.default.enforce_source (id INT, name STRING, amount BIGINT, extra_col STRING);
INSERT INTO main.default.enforce_source VALUES (1, 'Alice', 100, 'x'), (2, 'Bob', 200, 'y');
L’élément suivant MERGE échoue, car il assigne une valeur à unknown_column, qui n’existe pas dans enforce_demo. Azure Databricks renvoie une DELTA_MERGE_UNRESOLVED_EXPRESSION erreur qui nomme les colonnes qu’il peut résoudre :
MERGE INTO main.default.enforce_demo AS t
USING main.default.enforce_source AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET t.unknown_column = s.name
WHEN NOT MATCHED THEN INSERT (id, unknown_column) VALUES (s.id, s.name);
Le enforce_source tableau inclut une extra_col colonne qui enforce_demo n’a pas. Le suivant MERGE avec INSERT * réussit parce que la source contient chaque colonne cible. L’application de la loi ignore extra_col:
MERGE INTO main.default.enforce_demo AS t
USING main.default.enforce_source AS s
ON t.id = s.id
WHEN NOT MATCHED THEN INSERT *;
Modifier un schéma de table
Vous pouvez mettre à jour le schéma d’une table à l’aide d’instructions explicites ALTER TABLE ou de l’évolution automatique du schéma. Consultez Mettre à jour les schémas de table avec l’évolution du schéma.
Par exemple, pour ajouter une colonne explicitement :
ALTER TABLE catalog.schema.table_name ADD COLUMN new_column STRING;
Pour activer l’évolution automatique du schéma pour une opération d’écriture, définissez l’option mergeSchema :
SQL
SET spark.databricks.delta.schema.autoMerge.enabled = true;
INSERT INTO catalog.schema.table_name SELECT * FROM source_table;
Python
df.write.option("mergeSchema", "true").mode("append").saveAsTable("catalog.schema.table_name")
L’évolution du schéma a une sémantique spéciale pour les opérations INSERT et MERGE. Consultez Activer l’évolution du schéma.
Tables externes
Si vous modifiez les métadonnées d'une table externe directement avec des clients externes en dehors de Azure Databricks ou en utilisant l'accès basé sur le chemin, Unity Catalog ne synchronise pas automatiquement les mises à jour du schéma. Cela peut empêcher l’application des contraintes du schéma de s’effectuer correctement.
Exécutez MSCK REPAIR TABLE <table-name> SYNC METADATA pour synchroniser le schéma avec Unity Catalog. Voir REPAIR TABLE.