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.

INSERT Voorbeelden

Het invoegen van een rij met een kolom die niet in de doeltabel bestaat, mislukt bijvoorbeeld:

-- Fails: unknown_column does not exist in target_table
INSERT INTO catalog.schema.target_table (id, unknown_column) VALUES (1, 'value');

Invoegen met een compatibel type cast slaagt:

-- Succeeds: integer 42 is safely cast to BIGINT
INSERT INTO catalog.schema.target_table (id, bigint_column) VALUES (1, 42);

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

MERGE Voorbeelden

Het volgende MERGE mislukt bijvoorbeeld omdat de query probeert een waarde in unknown_columnte voegen, die niet bestaat in target_table:

MERGE INTO catalog.schema.target_table AS t
USING catalog.schema.source_table AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET t.unknown_column = s.value
WHEN NOT MATCHED THEN INSERT (id, unknown_column) VALUES (s.id, s.value);

Stel in een ander voorbeeld dat target_table de kolommen id en name heeft, en dat source_tableid, name en extra_col heeft. Het volgende MERGE met INSERT * negeert extra_col in de bron en slaagt omdat alle doelkolommen in de bron aanwezig zijn:

MERGE INTO catalog.schema.target_table AS t
USING catalog.schema.source_table 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.