Pular para o conteúdo principal

imposição de esquema

O Databricks valida a qualidade dos dados aplicando a imposição de esquema na gravação para tabelas Delta Lake. A imposição de esquema não se aplica a tabelas que usam formatos não Delta, como arquivos CSV ou JSON no armazenamento em cloud.

Imposição de esquema para operações de INSERT

O Databricks aplica as seguintes regras ao inserir dados em uma tabela:

  • Todas as colunas inseridas devem existir na tabela de destino.
  • Todos os tipos de dados da coluna devem corresponder aos tipos de dados da coluna na tabela de destino.
nota

O Databricks tenta converter com segurança os tipos de dados da coluna para que correspondam à tabela de destino.

Exemplos deINSERT

Os exemplos a seguir gravam em uma tabela Delta Lake gerenciada chamada enforce_demo. Para criá-la, execute o seguinte:

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

O seguinte INSERT falha porque unknown_column não existe em enforce_demo. O Databricks retorna um erro UNRESOLVED_COLUMN.WITH_SUGGESTION (SQLSTATE 42703) que sugere os nomes de coluna válidos:

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

O seguinte INSERT é bem-sucedido. O Databricks converte com segurança o inteiro 42 para o tipo BIGINT da coluna amount:

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

Imposição de esquema para operações de MERGE

Databricks aplica as seguintes regras ao inserir ou atualizar dados como parte de uma operação MERGE:

  • Se o tipo de dados na instrução de origem não corresponder à coluna de destino, o site MERGE tentará converter com segurança os tipos de dados da coluna para que correspondam à tabela de destino.
  • As colunas de destino de uma ação UPDATE ou INSERT devem existir na tabela de destino.
  • Ao usar INSERT * ou UPDATE SET *:
    • A fonte dataset deve ter todas as colunas presentes na tabela de destino.
    • A imposição ignora colunas no dataset de origem que não estão presentes na tabela de destino.

Exemplos deMERGE

Os exemplos a seguir reutilizam a tabela enforce_demo da seção anterior, juntamente com uma tabela de origem chamada enforce_source que possui uma coluna extra. Para criar a tabela de origem, execute o seguinte:

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

O seguinte MERGE falha porque atribui a unknown_column, que não existe em enforce_demo. O Databricks retorna um erro DELTA_MERGE_UNRESOLVED_EXPRESSION que nomeia as colunas que ele consegue resolver:

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

A tabela enforce_source inclui uma coluna extra_col que enforce_demo não possui. O seguinte MERGE com INSERT * é bem-sucedido porque a origem contém todas as colunas de destino. A imposição ignora extra_col:

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

Modificar um esquema de tabela

É possível atualizar o esquema de uma tabela usando declarações ALTER TABLE explícitas ou a evolução automática do esquema. Consulte Atualizar esquemas de tabela com a evolução do esquema.

Por exemplo, para adicionar uma coluna explicitamente:

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

Para habilitar a evolução do esquema automática para operações de escrita, defina a opção mergeSchema:

SQL
SET spark.databricks.delta.schema.autoMerge.enabled = true;
INSERT INTO catalog.schema.table_name SELECT * FROM source_table;

A evolução do esquema tem semântica especial para operações INSERT e MERGE . Consulte Ativar a evolução do esquema.

Tabelas externas

Se você modificar os metadados de uma tabela externa diretamente com clientes externos fora do Databricks ou usando acesso baseado em caminho, o Unity Catalog não sincroniza automaticamente as atualizações para o esquema. Isso pode impedir que a imposição de esquema seja aplicada corretamente.

Realize a execução de MSCK REPAIR TABLE <table-name> SYNC METADATA para sincronizar o esquema com o Unity Catalog. Consulte REPAIR TABLE.