Ş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 örnekleri

Aşağıdaki örnekler, enforce_demo adlı yönetilen bir Delta Lake tablosuna yazar. Oluşturmak için aşağıdakileri çalıştırın:

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

Aşağıdaki INSERT başarısız çünkü unknown_column içinde enforce_demoyoktur. Azure Databricks, geçerli sütun adlarını öneren bir UNRESOLVED_COLUMN.WITH_SUGGESTION hatası (SQLSTATE 42703) döndürür:

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

Aşağıdaki INSERT başarılı olur. Azure Databricks, tam sayı 42BIGINT sayısını sütunun amount tipine güvenli şekilde döker:

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

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

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 örnekleri

Aşağıdaki örnekler, önceki bölümdeki enforce_demo tabloyu ve ekstra bir sütuna sahip bir kaynak tablo enforce_source ile birlikte yeniden kullanılır. Kaynak tabloyu oluşturmak için aşağıdakileri çalıştırın:

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

Aşağıdaki MERGE, enforce_demo içinde bulunmayan unknown_column öğesine atama yaptığı için başarısız olur. Azure Databricks, çözebileceği sütunları adlandıran bir DELTA_MERGE_UNRESOLVED_EXPRESSION hata döndürür:

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

enforce_source tablosu, enforce_demo'de bulunmayan bir extra_col sütunu içerir. INSERT * ile aşağıdaki MERGE başarılı olur; çünkü kaynak tüm hedef sütunları içerir. Zorlama extra_col öğesini görmezden gelir:

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

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.