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.
O Databricks tenta converter com segurança os tipos de dados da coluna para que correspondam à tabela de destino.
INSERT Exemplos
Por exemplo, inserir uma linha com uma coluna que não existe na tabela de destino falha:
-- Fails: unknown_column does not exist in target_table
INSERT INTO catalog.schema.target_table (id, unknown_column) VALUES (1, 'value');
A inserção com uma conversão de tipo compatível é bem-sucedida:
-- Succeeds: integer 42 is safely cast to BIGINT
INSERT INTO catalog.schema.target_table (id, bigint_column) 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
MERGEtentará converter com segurança os tipos de dados da coluna para que correspondam à tabela de destino. - As colunas de destino de uma ação
UPDATEouINSERTdevem existir na tabela de destino. - Ao usar
INSERT *ouUPDATE 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.
MERGE Exemplos
Por exemplo, a seguinte MERGE falha porque a consulta tenta inserir um valor em unknown_column, que não existe em target_table:
MERGE INTO catalog.schema.target_table AS t
USING catalog.schema.source_table AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET t.unknown_column = s.value
WHEN NOT MATCHED THEN INSERT (id, unknown_column) VALUES (s.id, s.value);
Em outro exemplo, suponha que target_table tenha as colunas id e name, e que source_table tenha id, name e extra_col. O seguinte MERGE usando INSERT * ignora extra_col na origem e é bem-sucedido porque todas as colunas de destino estão presentes na origem:
MERGE INTO catalog.schema.target_table AS t
USING catalog.schema.source_table 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:
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
- Python
SET spark.databricks.delta.schema.autoMerge.enabled = true;
INSERT INTO catalog.schema.table_name SELECT * FROM source_table;
df.write.option("mergeSchema", "true").mode("append").saveAsTable("catalog.schema.table_name")
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.