Schemaerzwingung

Azure Databricks stellt die Datenqualität für Delta Lake-Tabellen durch Schemavalidierung beim Schreiben sicher. Die Schemaerzwingung gilt nicht für Tabellen mit Nicht-Delta-Formaten, z. B. CSV- oder JSON-Dateien im Cloudspeicher.

Durchsetzung des Schemas für INSERT Operationen

Azure Databricks erzwingt beim Einfügen von Daten in eine Tabelle die folgenden Regeln:

  • Alle eingefügten Spalten müssen in der Zieltabelle vorhanden sein.
  • Alle Spaltendatentypen müssen mit den Spaltendatentypen in der Zieltabelle übereinstimmen.

Anmerkung

Azure Databricks versucht, Spaltendatentypen sicher umzuwandeln, damit sie zur Zieltabelle passen.

Beispiele für INSERT

Die folgenden Beispiele schreiben in eine verwaltete Delta Lake-Tabelle namens enforce_demo. Um es zu erstellen, führen Sie Folgendes aus:

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

Das Folgende INSERT schlägt fehl, weil unknown_column in enforce_demonicht existiert. Azure Databricks gibt den Fehler UNRESOLVED_COLUMN.WITH_SUGGESTION (SQLSTATE 42703) zurück, der auf die gültigen Spaltennamen hinweist:

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

Das folgende INSERT ist erfolgreich. Azure Databricks konvertiert die ganze Zahl 42 sicher in den Typ BIGINT der Spalte amount:

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

Durchsetzung des Schemas für MERGE Operationen

Azure Databricks erzwingt beim Einfügen oder Aktualisieren von Daten im Rahmen eines MERGE Vorgangs die folgenden Regeln:

  • Wenn der Datentyp in der Quell-Anweisung nicht mit der Zielspalte übereinstimmt, versucht MERGE, Spaltendatentypen sicher zu umwandeln, um der Zieltabelle zu entsprechen.
  • Die Zielspalten einer UPDATE- oder INSERT-Aktion müssen in der Zieltabelle vorhanden sein.
  • Bei Verwendung INSERT * oder UPDATE SET *:
    • Das Quell-Dataset muss alle Spalten in der Zieltabelle enthalten.
    • Die Durchsetzung ignoriert Spalten im Quelldatensatz, die in der Zieltabelle nicht vorhanden sind.

Beispiele für MERGE

Die folgenden Beispiele verwenden die enforce_demo Tabelle aus dem vorherigen Abschnitt wieder, zusammen mit einer Quelltabelle enforce_source , die eine zusätzliche Spalte hat. Um die Quelltabelle zu erstellen, führen Sie Folgendes aus:

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

Der folgende MERGE schlägt fehl, weil er unknown_column einen Wert zuweist, das in enforce_demo nicht existiert. Azure Databricks liefert einen DELTA_MERGE_UNRESOLVED_EXPRESSION Fehler, der die Spalten nennt, die es lösen kann:

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

Die Tabelle enforce_source enthält eine extra_col Spalte, über die enforce_demo nicht verfügt. Das folgende MERGE mit INSERT * ist erfolgreich, weil die Quelle jede Zielspalte enthält. Die Durchsetzung ignoriert: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 *;

Ändern eines Tabellenschemas

Sie können das Schema einer Tabelle mithilfe expliziter ALTER TABLE Anweisungen oder der automatischen Schemaentwicklung aktualisieren. Siehe Aktualisieren von Tabellenschemas mit Schemaentwicklung.

So fügen Sie beispielsweise eine Spalte explizit hinzu:

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

Um die automatische Schemaentwicklung für einen Schreibvorgang zu aktivieren, legen Sie die mergeSchema Option fest:

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

Die Schemaentwicklung verfügt über spezielle Semantik für INSERT und MERGE Vorgänge. Siehe Aktivieren der Schemaentwicklung.

Externe Tabellen

Wenn Sie die Metadaten einer externen Tabelle direkt mit externen Clients außerhalb Azure Databricks oder mithilfe des pfadbasierten Zugriffs ändern, synchronisiert Unity Catalog keine Aktualisierungen automatisch mit dem Schema. Dies könnte verhindern, dass das Schema korrekt durchgesetzt wird.

Führen Sie MSCK REPAIR TABLE <table-name> SYNC METADATA aus, um das Schema mit Unity Catalog zu synchronisieren. Siehe REPAIR TABLE.