Tipo de ampliação
Visualização
Esse recurso está em Public Preview em Databricks Runtime 15.4 LTS e acima.
Tabelas com ampliação de tipo ativada permitem que você altere os tipos de dados da coluna para um tipo mais amplo sem reescrever os arquivos de dados subjacentes. O senhor pode alterar os tipos de coluna manualmente ou usar a evolução do esquema para desenvolver os tipos de coluna.
A ampliação de tipos está disponível em Databricks Runtime 15.4 LTS e acima. As tabelas com ampliação de tipo ativada só podem ser lidas em Databricks Runtime 15.4 LTS e acima.
O alargamento do tipo requer o Delta Lake. Todas as tabelas gerenciar Unity Catalog usam Delta Lake por default.
Alterações de tipo suportadas
Você pode ampliar os tipos de acordo com as seguintes regras:
Tipo de origem | Tipos mais amplos suportados |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Para evitar a promoção acidental de valores inteiros para decimais, o senhor deve alterar manualmente o tipo commitde byte
, short
, int
, ou long
para decimal
ou double
. Ao promover um tipo de inteiro para decimal
ou double
, se qualquer ingestão downstream gravar esse valor de volta em uma coluna de inteiro, Spark truncará a parte fracionária dos valores por default.
Ao alterar qualquer tipo numérico para decimal
, a precisão total deve ser igual ou maior que a precisão inicial. Se o senhor também aumentar a escala, a precisão total deverá aumentar em um valor correspondente.
A meta mínima para os tipos byte
, short
e int
é decimal(10,0)
. A meta mínima para long
é decimal(20,0)
.
Se você quiser adicionar duas casas decimais a um campo com decimal(10,1)
, o alvo mínimo é decimal(12,3)
.
As alterações de tipo são suportadas para colunas e campos de nível superior aninhados em estruturas, mapas e matrizes.
Ativar ampliação de texto
Você pode ativar a ampliação de tipo em uma tabela existente definindo a propriedade da tabela delta.enableTypeWidening
como true
:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true')
Você também pode ativar a ampliação de texto durante a criação da tabela:
CREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')
Quando o senhor ativa a ampliação de tipo, ele define o recurso de tabela typeWidening
, que atualiza os protocolos de leitura e gravação. O senhor deve usar o site Databricks Runtime 15.4 ou o acima for para interagir com tabelas com a ampliação de tipos ativada. Se os clientes externos também interagirem com a tabela, verifique se eles suportam esse recurso da tabela. Consulte Delta Lake recurso compatibilidade e protocolos.
Aplicar manualmente uma alteração de tipo
Use o comando ALTER COLUMN
para alterar manualmente os tipos:
ALTER TABLE <table_name> ALTER COLUMN <col_name> TYPE <new_type>
Essa operação atualiza o esquema da tabela sem reescrever os arquivos de dados subjacentes.
Ampliar os tipos com a evolução automática do esquema
A evolução do esquema funciona com a ampliação do tipo para atualizar os tipos de dados nas tabelas de destino para que correspondam ao tipo de dados recebidos.
Sem a ampliação do tipo ativada, a evolução do esquema sempre tenta fazer o downcast dos dados para corresponder aos tipos de coluna na tabela de destino. Se o senhor não quiser ampliar automaticamente os tipos de dados nas tabelas de destino, desative a ampliação de tipos antes de executar cargas de trabalho com a evolução do esquema ativada.
Para usar a evolução do esquema para ampliar o tipo de dados de uma coluna durante a ingestão, o senhor deve atender às seguintes condições:
- A execução do comando de gravação com a evolução automática do esquema ativada.
- A tabela de destino tem a ampliação de tipos ativada.
- O tipo de coluna de origem é mais largo do que o tipo de coluna de destino.
- A ampliação de tipo suporta a mudança de tipo.
- A mudança de tipo não é de
byte
,short
,int
oulong
paradecimal
oudouble
. Essas alterações de tipo só podem ser aplicadas manualmente usando ALTER TABLE para evitar a promoção acidental de inteiros para decimais.
As incompatibilidades de tipos que não atendem a todas essas condições seguem as regras normais de imposição de esquema. Ver imposição de esquema.
Desativar o recurso de tabela de ampliação de tipos
Você pode evitar a ampliação acidental de tipos em tabelas habilitadas definindo a propriedade como false
:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'false')
Essa configuração impede futuras alterações de tipo na tabela, mas não remove o recurso de tabela de ampliação de tipo nem desfaz os tipos que foram alterados.
Se o senhor precisar remover completamente o recurso da tabela de ampliação de tipo, poderá usar o comando DROP FEATURE
, conforme mostrado no exemplo a seguir:
ALTER TABLE <table-name> DROP FEATURE 'typeWidening' [TRUNCATE HISTORY]
As tabelas que habilitaram a ampliação de tipo usando o Databricks Runtime 15.4 LTS exigem a eliminação do recurso typeWidening-preview
.
Ao eliminar a ampliação de texto, todos os arquivos de dados que não estão em conformidade com o esquema de tabela atual são reescritos. Consulte Drop a Delta Lake table recurso e downgrade table protocol.
transmissão de uma tabela Delta
O suporte para Type Widening na transmissão estruturada está disponível em Databricks Runtime 16.3 e acima.
Na transmissão de uma tabela Delta, as alterações de tipo são tratadas como alterações de esquema não aditivas, de forma semelhante à renomeação ou eliminação de uma coluna com o Column Mapping.
O senhor pode fornecer um local de acompanhamento de esquema para permitir a transmissão de Delta Lake tabelas com uma alteração de tipo aplicada.
Cada transmissão lida em uma fonte de dados deve ter seu próprio schemaTrackingLocation
especificado. O schemaTrackingLocation
especificado deve estar contido no diretório especificado para o checkpointLocation
da tabela de destino para gravação de transmissão.
Para cargas de trabalho de transmissão que combinam dados de várias tabelas de origem Delta, o senhor deve especificar diretórios exclusivos no checkpointLocation
para cada tabela de origem.
A opção schemaTrackingLocation
é usada para especificar o caminho para o acompanhamento do esquema, conforme mostrado no exemplo de código a seguir:
- Python
- Scala
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
Depois de fornecer um local de acompanhamento do esquema, a transmissão evoluirá seu esquema rastreado sempre que uma alteração de tipo for detectada e, em seguida, parará. Nesse momento, o senhor pode tomar qualquer medida necessária para lidar com a mudança de tipo, como ativar a ampliação de tipo na tabela downstream ou atualizar a consulta de transmissão.
Para retomar o processamento, defina a configuração do Spark spark.databricks.delta.streaming.allowSourceColumnTypeChange
ou a opção de leitura do DataFrame allowSourceColumnTypeChange
:
- Python
- Scala
- SQL
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
# alternatively to allow all future type changes for this stream:
# .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
// alternatively to allow all future type changes for this stream:
// .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
-- To unblock for this particular stream just for this series of schema change(s):
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange.ckpt_<checkpoint_id> = "<delta_source_table_version>"
-- To unblock for this particular stream:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "<delta_source_table_version>"
-- To unblock for all streams:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "always"
O ID do ponto de verificação <checkpoint_id>
e a versão da tabela de origem Delta Lake <delta_source_table_version>
são exibidos na mensagem de erro quando a transmissão é interrompida.
Delta Sharing
O suporte para Type Widening em Delta Sharing está disponível em Databricks Runtime 16.1 e acima.
O compartilhamento de uma tabela Delta Lake com a ampliação de tipos ativada é suportado em Databricks-to-Databricks Delta Sharing. O provedor e o destinatário devem estar em Databricks Runtime 16.1 ou acima.
Para ler o Change Data Feed de uma tabela do Delta Lake com ampliação de tipo ativada usando o Delta Sharing, o senhor deve definir o formato de resposta como delta
:
spark.read
.format("deltaSharing")
.option("responseFormat", "delta")
.option("readChangeFeed", "true")
.option("startingVersion", "<start version>")
.option("endingVersion", "<end version>")
.load("<table>")
A leitura do feed de dados de alteração em todas as alterações de tipo não é suportada. Em vez disso, o senhor deve dividir as operações em duas leituras separadas, uma terminando na versão da tabela que contém a alteração de tipo e a outra começando na versão que contém a alteração de tipo.
Limitações
Compatibilidade com o Iceberg
Iceberg não é compatível com todas as alterações de tipo cobertas pela ampliação de tipo, consulte Iceberg evolução do esquema. Em particular, o Databricks não é compatível com as seguintes alterações de tipo:
byte
,short
,int
,long
adecimal
oudouble
- aumento da escala decimal
date
paratimestampNTZ
Quando o UniForm com compatibilidade Iceberg está ativado em uma tabela Delta Lake, a aplicação de uma dessas alterações de tipo resulta em um erro.
Se o senhor aplicar uma dessas alterações de tipo sem suporte a uma tabela Delta Lake, a ativação da compatibilidade Uniforme com Iceberg na tabela resultará em um erro. Para resolver o erro, o senhor deve eliminar o recurso de tabela de ampliação de tipos.
Outras limitações
- Não há suporte para o fornecimento de um local de acompanhamento de esquema usando SQL quando a transmissão de uma tabela Delta Lake com uma alteração de tipo.
- Não há suporte para o compartilhamento de uma tabela usando o Delta Sharing com a ampliação de tipo ativada com consumidores que não sejam da Databricks.