application des schémas
Databricks valide la qualité des données en imposant un schéma à l'écriture pour les tables Delta Lake. L'application des schémas ne s'applique pas aux tables utilisant des formats non Delta, tels que les fichiers CSV ou JSON dans le stockage cloud.
Application des schémas pour les INSERT Opérations
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 de la table cible.
Databricks tente de convertir en toute sécurité les types de données des colonnes pour correspondre à la table cible.
ExemplesINSERT
Les exemples suivants écrivent dans une table Delta Lake gérée nommée enforce_demo. Pour le créer, exécutez ce qui suit :
CREATE OR REPLACE TABLE main.default.enforce_demo (id INT, name STRING, amount BIGINT);
Le INSERT suivant échoue car unknown_column n’existe pas dans enforce_demo. Databricks renvoie une erreur UNRESOLVED_COLUMN.WITH_SUGGESTION (SQLSTATE 42703) qui suggère les noms de colonne valides :
INSERT INTO main.default.enforce_demo (id, unknown_column) VALUES (1, 'value');
Le INSERT suivant est réalisé avec succès. Databricks convertit en toute sécurité l'entier 42 vers le type BIGINT de la colonne amount :
INSERT INTO main.default.enforce_demo (id, amount) VALUES (1, 42);
Application des schémas pour les MERGE Opérations
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érations :
- Si le type de données dans l'instruction source ne correspond pas à la colonne cible,
MERGEtente de convertir en toute sécurité les types de données de colonne pour correspondre à la table cible. - Les colonnes cibles d'une action
UPDATEouINSERTdoivent exister dans la table cible. - Lors de l'utilisation de
INSERT *ouUPDATE SET *:- Le dataset source doit avoir toutes les colonnes présentes dans la table cible.
- L'application de la règle ignore les colonnes dans le dataset source qui ne sont pas présentes dans la table cible.
ExemplesMERGE
Les exemples suivants réutilisent la table enforce_demo de la section précédente, ainsi qu’une table source nommée enforce_source qui possède 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');
Le MERGE suivant échoue car il effectue une attribution à unknown_column, qui n’existe pas dans enforce_demo. Databricks renvoie une erreur DELTA_MERGE_UNRESOLVED_EXPRESSION 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);
La table enforce_source inclut une colonne extra_col que enforce_demo ne possède pas. Le MERGE suivant avec INSERT * réussit car la source contient toutes les colonnes cibles. L’application 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 ALTER TABLE explicites ou de l'évolution automatique des schémas. Voir Mettre à jour les schémas de table avec l'évolution des schémas.
Par exemple, pour ajouter une colonne explicitement :
ALTER TABLE catalog.schema.table_name ADD COLUMN new_column STRING;
Pour activer l’évolution des schémas automatique pour une opération d’écriture, définissez l’option mergeSchema :
- SQL
- Python
SET spark.databricks.delta.schema.autoMerge.enabled = true;
INSERT INTO catalog.schema.table_name SELECT * FROM source_table;
df.write.option("mergeSchema", "true").mode("append").saveAsTable("catalog.schema.table_name")
L'évolution des schémas a une sémantique particulière pour les opérations INSERT et MERGE. Voir Activer l'évolution des schémas.
Tables externes
Si vous modifiez les métadonnées d'une table externe directement avec des clients externes en dehors de Databricks ou en utilisant un accès basé sur un chemin, Unity Catalog ne synchronise pas automatiquement les mises à jour du schéma. Cela pourrait empêcher l'application des schémas de s'effectuer correctement.
Exécutez MSCK REPAIR TABLE <table-name> SYNC METADATA pour synchroniser le schéma avec Unity Catalog. Voir REPAIR TABLE.