Aller au contenu principal

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.
remarque

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 :

SQL
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 :

SQL
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 :

SQL
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, MERGE tente de convertir en toute sécurité les types de données de colonne pour correspondre à la table cible.
  • Les colonnes cibles d'une action UPDATE ou INSERT doivent exister dans la table cible.
  • Lors de l'utilisation de INSERT * ou UPDATE 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 :

SQL
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 :

SQL
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:

SQL
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 :

SQL
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
SET spark.databricks.delta.schema.autoMerge.enabled = true;
INSERT INTO catalog.schema.table_name SELECT * FROM source_table;

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.