Schema afdwingen

Azure Databricks valideert de gegevenskwaliteit door schema's af te dwingen voor schrijfbewerkingen voor Delta Lake-tabellen. Schema afdwingen is niet van toepassing op tabellen met niet-Delta-indelingen, zoals CSV- of JSON-bestanden in cloudopslag.

Afdwinging van schema's voor INSERT bewerkingen

Azure Databricks dwingt de volgende regels af bij het invoegen van gegevens in een tabel:

  • Alle ingevoegde kolommen moeten aanwezig zijn in de doeltabel.
  • Alle kolomgegevenstypen moeten overeenkomen met de kolomgegevenstypen in de doeltabel.

Notitie

Azure Databricks probeert kolomgegevenstypen veilig te casten zodat deze overeenkomen met de doeltabel.

voorbeelden van INSERT

De volgende voorbeelden schrijven naar een beheerde Delta Lake-tabel genaamd enforce_demo. Om het te maken, voer je het volgende uit:

CREATE OR REPLACE TABLE main.default.enforce_demo (id INT, name STRING, amount BIGINT);

Het volgende INSERT faalt omdat unknown_column niet bestaat in enforce_demo. Azure Databricks geeft een UNRESOLVED_COLUMN.WITH_SUGGESTION foutmelding (SQLSTATE 42703) die de geldige kolomnamen suggereert:

INSERT INTO main.default.enforce_demo (id, unknown_column) VALUES (1, 'value');

Het volgende INSERT is geslaagd. Azure Databricks cast het gehele getal 42 veilig naar het type BIGINT van de kolom amount:

INSERT INTO main.default.enforce_demo (id, amount) VALUES (1, 42);

Afdwinging van schema's voor MERGE bewerkingen

Azure Databricks dwingt de volgende regels af bij het invoegen of bijwerken van gegevens als onderdeel van een MERGE bewerking:

  • Als het gegevenstype in de broninstructie niet overeenkomt met de doelkolom, probeert MERGE kolomgegevenstypen veilig te casten zodat deze overeenkomen met de doeltabel.
  • De doelkolommen van een UPDATE of INSERT actie moeten aanwezig zijn in de doeltabel.
  • Bij gebruik van INSERT * of UPDATE SET *:
    • De brongegevensset moet alle kolommen bevatten die aanwezig zijn in de doeltabel.
    • Handhaving negeert kolommen in de brongegevensverzameling die niet aanwezig zijn in de doeltabel.

voorbeelden van MERGE

De volgende voorbeelden hergebruiken de enforce_demo tabel uit de vorige sectie, samen met een brontabel met een extra enforce_source kolom. Om de brontabel te maken, voer je het volgende uit:

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');

Het volgende MERGE faalt omdat het toewijst aan unknown_column, wat niet bestaat in enforce_demo. Azure Databricks geeft een DELTA_MERGE_UNRESOLVED_EXPRESSION foutmelding die de kolommen benoemt die het kan oplossen:

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);

De enforce_source tabel bevat een extra_col kolom die enforce_demo niet heeft. Het volgende MERGE met INSERT * slaagt omdat de bron elke doelkolom bevat. Handhaving negeert: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 *;

Een tabelschema wijzigen

U kunt het schema van een tabel bijwerken met behulp van expliciete ALTER TABLE instructies of automatische schemaontwikkeling. Zie Tabelschema's bijwerken met schemaontwikkeling.

Als u bijvoorbeeld expliciet een kolom wilt toevoegen:

ALTER TABLE catalog.schema.table_name ADD COLUMN new_column STRING;

Als u automatische schemaontwikkeling voor een schrijfbewerking wilt inschakelen, stelt u de mergeSchema optie in:

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")

Schemaontwikkeling heeft speciale semantiek voor INSERT en MERGE bewerkingen. Zie Ontwikkeling van schema inschakelen.

Externe tabellen

Als u de metagegevens van een externe tabel rechtstreeks wijzigt met externe clients buiten Azure Databricks of met behulp van op pad gebaseerde toegang, worden updates van het schema niet automatisch gesynchroniseerd met Unity Catalog. Dit voorkomt mogelijk dat de afdwinging van het schema correct wordt toegepast.

Voer MSCK REPAIR TABLE <table-name> SYNC METADATA uit om het schema te synchroniseren met Unity Catalog. Zie REPAIR TABLE.