Şema uygulaması

Azure Databricks, Delta Lake tabloları için yazmada şemayı zorunlu kılarak veri kalitesini doğrular. Şema zorlaması, bulut depolamada bulunan CSV veya JSON dosyaları gibi Delta dışı biçimleri kullanan tablolara uygulanmaz.

INSERT işlemleri için şema zorunlu kılma

Azure Databricks, tabloya veri eklerken aşağıdaki kuralları uygular:

  • Eklenen tüm sütunlar hedef tabloda bulunmalıdır.
  • Tüm sütun veri türlerinin hedef tablodaki sütun veri türleriyle eşleşmesi gerekir.

Not

Azure Databricks, sütun veri türlerini hedef tabloyla eşleşecek şekilde güvenli bir şekilde atamayı dener.

INSERT Örnekler

Örneğin, hedef tabloda mevcut olmayan bir sütuna sahip bir satır ekleme işlemi başarısız olur:

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

Uyumlu tür ataması ile ekleme başarılı olur:

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

MERGE işlemleri için şema zorlaması

Azure Databricks, bir MERGE işleminin parçası olarak veri eklerken veya güncelleştirirken aşağıdaki kuralları uygular:

  • Kaynak deyimindeki veri türü hedef sütunla eşleşmiyorsa, MERGE hedef tabloyla eşleşmesi için sütun veri türlerini güvenli bir şekilde atamaya çalışır.
  • UPDATE veya INSERT eyleminin hedef sütunları hedef tabloda bulunmalıdır.
  • INSERT * veya UPDATE SET * kullanırken:
    • Kaynak veri kümesinde hedef tabloda tüm sütunlar bulunmalıdır.
    • Zorunlu kılma, hedef tabloda bulunmayan kaynak veri kümesi sütunlarını yok sayar.

MERGE Örnekler

Örneğin, aşağıdaki MERGE başarısız olur çünkü sorgu, target_table içinde bulunmayan unknown_column içine bir değer eklemeye çalışır:

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

Başka bir örnekte, target_table'ın id ve name sütunlarına, source_table'ün ise id, name ve extra_col öğelerine sahip olduğunu varsayalım. INSERT * kullanan aşağıdaki MERGE, kaynaktaki extra_col öğesini yok sayar ve tüm hedef sütunlar kaynakta bulunduğu için başarılı olur:

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

Tablo şemasını değiştirme

Açık ALTER TABLE deyimleri veya otomatik şema evrimini kullanarak bir tablonun şemasını güncelleştirebilirsiniz. Bkz . Tablo şemalarını şema evrimi ile güncelleştirme.

Örneğin, açıkça bir sütun eklemek için:

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

Bir yazma işlemi için otomatik şema evrimini etkinleştirmek için şu mergeSchema seçeneği ayarlayın:

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

Şema evriminin INSERT ve MERGE işlemleri için özel bir semantiği vardır. Bkz Şema evrimini etkinleştirme.

Dış tablolar

Dış tablonun meta verilerini doğrudan Azure Databricks dışındaki dış istemcilerle veya yol tabanlı erişim kullanarak değiştirirseniz, Unity Kataloğu güncelleştirmeleri şemayla otomatik olarak eşitlemez. Bu, şema uygulamasının doğru şekilde gerçekleşmesini engelleyebilir.

Şemayı Unity Kataloğu ile eşitlemek için komutunu çalıştırın MSCK REPAIR TABLE <table-name> SYNC METADATA . Bkz. REPAIR TABLE.