Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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.