Séma érvényesítés

Azure Databricks a Delta Lake-táblák írási sémájának kényszerítésével ellenőrzi az adatminőséget. A sémakényszerítés nem vonatkozik a nem Delta formátumot használó táblákra, például a felhőbeli tárolóban lévő CSV- vagy JSON-fájlokra.

Séma érvényesítése az INSERT műveletekhez

Az Azure Databricks a következő szabályokat kényszeríti ki, amikor adatokat szúr be egy táblába:

  • A céltáblában minden beszúrt oszlopnak léteznie kell.
  • Minden oszlopadattípusnak meg kell egyeznie a céltáblában szereplő oszlopadattípusokkal.

Jegyzet

Az Azure Databricks megpróbálja biztonságosan átkonvertálni az oszlop adattípusait a céltáblához igazodva.

INSERT Példák

A céltáblában nem létező oszlopot tartalmazó sor beszúrása például meghiúsul:

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

A kompatibilis típusjelekkel való beszúrás sikeres:

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

Sémaérvényesítés a(z) MERGE műveletekhez

Az Azure Databricks az alábbi szabályokat kényszeríti ki az adatok MERGE művelet részeként történő beszúrásakor vagy frissítésekor:

  • Ha a forrásutasítás adattípusa nem egyezik meg a céloszloptal, MERGE megpróbálja biztonságosan leadni az oszlop adattípusokat a céltáblának megfelelően.
  • Egy UPDATE vagy INSERT művelet céloszlopainak létezniük kell a céltáblában.
  • INSERT * vagy UPDATE SET * használatakor:
    • A forrásadatkészletnek tartalmaznia kell a céltáblában található összes oszlopot.
    • A kényszerítés figyelmen kívül hagyja a forrásadatkészlet azon oszlopait, amelyek nem szerepelnek a céltáblában.

MERGE Példák

A következők MERGE például meghiúsulnak, mert a lekérdezés megpróbál beszúrni egy értéket unknown_column, amely nem létezik a következőben 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);

Egy másik példában tegyük fel, hogy a(z) target_table oszlopai id és name, a(z) source_table pedig id-vel, name-tel és extra_col-tal rendelkezik. Az alábbi MERGE, amely a(z) INSERT * használja, figyelmen kívül hagyja a forrásban lévő extra_col elemet, és sikeresen lefut, mert az összes céloszlop megtalálható a forrásban:

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

Táblaséma módosítása

A táblázat sémáját explicit ALTER TABLE utasításokkal vagy automatikus sémafejlődéssel frissítheti. Lásd: Táblaséma frissítése sémafejlődéssel.

Például egy oszlop explicit hozzáadásához:

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

Ha engedélyezni szeretné az automatikus sémafejlődést egy írási művelethez, állítsa be a mergeSchema következő beállítást:

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

A sémafejlődés speciális szemantikával rendelkezik a INSERT és MERGE műveletekhez. Lásd: Sémafejlődés engedélyezése.

Külső táblák

Ha egy külső tábla metaadatait közvetlenül Azure Databricks kívüli külső ügyfelekkel módosítja, vagy útvonalalapú hozzáféréssel, a Unity Catalog nem szinkronizálja automatikusan a frissítéseket a sémába. Ez megakadályozhatja a sémakényszerítés helyes alkalmazását.

Futtassa MSCK REPAIR TABLE <table-name> SYNC METADATA a sémát a Unity Catalogtal való szinkronizálásához. Lásd a(z) REPAIR TABLE.