Контроль соблюдения схемы

Azure Databricks проверяет качество данных, обеспечивая соблюдение схемы при записи в таблицы Delta Lake. Принудительное применение схемы не распространяется на таблицы, использующие форматы, отличные от Delta, например файлы CSV или JSON в облачном хранилище.

Обязательное применение схемы для операций INSERT

Azure Databricks применяет следующие правила при вставке данных в таблицу:

  • Все вставленные столбцы должны существовать в целевой таблице.
  • Все типы данных столбцов должны соответствовать типам данных столбца в целевой таблице.

Заметка

Azure Databricks пытается безопасно привести типы данных столбцов, чтобы они соответствовали целевой таблице.

примеры INSERT

Следующие примеры записываются в управляемую таблицу Delta Lake под названием enforce_demo. Чтобы создать его, запустите следующее:

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

Следующее INSERT не срабатывает, потому что unknown_column не существует в enforce_demo. Azure Databricks выдаёт ошибку UNRESOLVED_COLUMN.WITH_SUGGESTION (SQLSTATE 42703) с указанием допустимых имён столбцов:

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

Следующее INSERT выполняется успешно. Azure Databricks безопасно приводит целое число 42 к типу BIGINT столбца amount:

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

Обязательное применение схемы для операций MERGE

Azure Databricks применяет следующие правила при вставке или обновлении данных в рамках операции MERGE:

  • Если тип данных в исходной инструкции не соответствует целевому столбцу, MERGE пытается безопасно привести типы данных столбцов для сопоставления целевой таблицы.
  • Целевые столбцы действия UPDATEINSERT должны существовать в целевой таблице.
  • При использовании INSERT * или UPDATE SET *:
    • Исходный набор данных должен содержать все столбцы, присутствующих в целевой таблице.
    • При принудительном выполнении игнорируются столбцы в исходном наборе данных, отсутствующие в целевой таблице.

примеры MERGE

В следующих примерах повторно используются таблица enforce_demo из предыдущего раздела, а также исходная таблица с именем enforce_source, у которой есть дополнительный столбец. Чтобы создать исходную таблицу, выполните следующее:

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

Следующее MERGE завершается с ошибкой, потому что присваивает значение unknown_column, которого не существует в enforce_demo. Azure Databricks возвращает ошибку DELTA_MERGE_UNRESOLVED_EXPRESSION, в которой перечислены столбцы, которые ей удаётся распознать:

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 включает столбец extra_col, которого нет в enforce_demo. Следующий MERGE с INSERT * успешно выполняется, потому что исходный код содержит все целевые столбцы. Правоприменение 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 *;

Изменение схемы таблицы

Схему таблицы можно обновить с помощью явных ALTER TABLE инструкций или автоматической эволюции схемы. См. статью "Обновление схем таблиц с развитием схемы".

Например, чтобы добавить столбец явным образом:

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

Чтобы включить автоматическую эволюцию схемы для операции записи, задайте mergeSchema параметр:

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

Эволюция схемы имеет специальную семантику для операций INSERT и MERGE. См. раздел "Включить эволюцию схемы".

Внешние таблицы

Если вы изменяете метаданные внешней таблицы напрямую с помощью внешних клиентов вне Azure Databricks или используя доступ по пути, Unity Catalog не синхронизирует изменения схемы автоматически. Это может помешать корректному принудительному применению схемы.

Выполните MSCK REPAIR TABLE <table-name> SYNC METADATA, чтобы синхронизировать схему с Unity Catalog. См. REPAIR TABLE.