Aplicação do esquema

O Azure Databricks valida a qualidade dos dados ao impor o esquema na escrita nas tabelas do Delta Lake. A aplicação de esquema não se aplica a tabelas que usam formatos não Delta, como ficheiros CSV ou JSON em armazenamento na cloud.

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

O Azure Databricks impõe as seguintes regras ao inserir dados em uma tabela:

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

Observação

O Azure Databricks tenta mudar o tipo de dados de coluna de forma segura de forma a corresponder à tabela de destino.

INSERT exemplos

Os exemplos seguintes escrevem para uma tabela gerida do Delta Lake chamada enforce_demo. Para o criar, execute o seguinte:

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 Azure Databricks devolve um erro UNRESOLVED_COLUMN.WITH_SUGGESTION (SQLSTATE 42703) que sugere os nomes válidos das colunas:

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

O seguinte INSERT é bem-sucedido. O Azure Databricks converte de forma segura o inteiro 42 para o tipo BIGINT da coluna amount:

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

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

O Azure Databricks impõe as seguintes regras ao inserir ou atualizar dados como parte de uma operação de MERGE:

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

MERGE exemplos

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

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 Azure Databricks devolve um DELTA_MERGE_UNRESOLVED_EXPRESSION erro que nomeia as colunas que pode resolver:

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 enforce_source tabela inclui uma extra_col coluna que enforce_demo não tem. O seguinte MERGE com INSERT * tem sucesso porque a fonte contém todas as colunas alvo. A fiscalização ignora 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 *;

Modificar um esquema de tabela

Pode atualizar o esquema de uma tabela usando instruções explícitas ALTER TABLE ou evolução automática do esquema. Veja Atualizar esquemas de tabela com evolução de esquemas.

Por exemplo, para adicionar uma coluna explicitamente:

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

Para permitir a evolução automática do esquema numa operação de escrita, defina a mergeSchema opção:

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

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

Tabelas externas

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

Executa MSCK REPAIR TABLE <table-name> SYNC METADATA para sincronizar o esquema com o Unity Catalog. Consulte REPAIR TABLE.