Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Azure Databricks aproveita a funcionalidade do Delta Lake para dar suporte a duas opções distintas para substituições seletivas:
- A opção
replaceWheresubstitui atomicamente todos os registros que correspondem a um determinado predicado. - Você pode substituir diretórios de dados com base em como as tabelas são particionadas usando substituições de partição dinâmica.
Para a maioria das operações, o Databricks recomenda usar replaceWhere para especificar quais dados substituir.
Important
Se os dados tiverem sido substituídos acidentalmente, você poderá usar restaurar para desfazer a alteração.
Substituição seletiva arbitrária com replaceWhere
Você pode substituir seletivamente apenas os dados que correspondem a uma expressão arbitrária.
Note
O SQL requer o Databricks Runtime 12.2 LTS ou superior.
O comando a seguir substitui atomicamente os eventos em janeiro na tabela de destino, que é particionada por start_date, com dados em replace_data:
Python
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("events")
)
Scala
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("events")
SQL
INSERT INTO TABLE events REPLACE WHERE start_date >= '2017-01-01' AND end_date <= '2017-01-31' SELECT * FROM replace_data
Este código de exemplo grava os dados em replace_data, valida se todas as linhas correspondem ao predicado e executa uma substituição atômica usando a semântica overwrite. Se algum valor na operação estiver fora da restrição, ocorrerá uma falha nessa operação com um erro por padrão.
Você pode alterar esse comportamento para valores overwrite dentro do intervalo do predicado e os registros insert que ficam fora do intervalo especificado. Para fazer isso, desabilite a verificação de restrição definindo spark.databricks.delta.replaceWhere.constraintCheck.enabled como false usando uma das seguintes configurações:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.constraintCheck.enabled=false
Comportamento herdado
O comportamento padrão herdado fez com que replaceWhere sobrescrevesse os dados correspondentes a um predicado apenas sobre colunas de partição. Com esse modelo herdado, o comando a seguir substituiria atomicamente o mês de janeiro na tabela de destino, que é particionada por date, pelos dados em df:
Python
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("people10m")
Se quiser voltar ao comportamento antigo, você poderá desabilitar o sinalizador spark.databricks.delta.replaceWhere.dataColumns.enabled:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.dataColumns.enabled=false
Substituições de partições dinâmicas
A substituição de partição dinâmica atualiza somente as partições para as quais a gravação confirma novos dados. Ele substitui todos os dados existentes nessas partições e deixa outros inalterados.
O Azure Databricks dá suporte a duas abordagens:
-
REPLACE USING(recomendado) – funciona em todos os tipos de computação, incluindo databricks SQL warehouses, computação sem servidor e computação clássica. Não requer a definição de uma configuração de sessão do Spark. -
partitionOverwriteMode(herdado) – requer computação clássica e configuração de uma configuração de sessão do Spark. Não há suporte no Databricks SQL ou na computação sem servidor.
As seções abaixo demonstram como usar cada abordagem.
Substituições de partição dinâmica com REPLACE USING
O Databricks Runtime 16.3 e versões superiores dá suporte a substituições dinâmicas de partição para tabelas particionadas usando REPLACE USING. Esse método permite substituir seletivamente dados em todos os tipos de computação, sem a necessidade de definir uma configuração de sessão do Spark.
REPLACE USING permite um comportamento de substituição atômica independente de computação que funciona em SQL warehouses do Databricks, computação sem servidor e computação clássica.
REPLACE USING substitui apenas as partições alvo dos dados de entrada. Todas as outras partições permanecem inalteradas.
O exemplo a seguir demonstra como usar a substituição dinâmica de partição com REPLACE USING. Atualmente, você só pode usar SQL, não Python ou Scala. Para obter detalhes, consulte INSERT na referência da linguagem SQL.
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
Tenha em mente as seguintes restrições e comportamentos em relação às sobreposições dinâmicas de partição:
- Você deve especificar o conjunto completo das colunas de partição da tabela na
USINGcláusula. - Sempre valide se os dados gravados alcançam apenas as partições esperadas. Uma única linha na partição errada pode acabar sobrescrevendo involuntariamente toda a partição.
Se você precisar de uma lógica de correspondência mais personalizável do que o que REPLACE USING suporta, como tratar os valores de NULL como iguais, use o complementar REPLACE ON. Consulte INSERT para obter detalhes.
Substituições de partição dinâmica com partitionOverwriteMode (herdado)
Important
Esse recurso está em Visualização Pública.
O Databricks Runtime 11.3 LTS e versões posteriores oferecem suporte a substituições dinâmicas de partição para tabelas particionadas usando o modo de substituição: INSERT OVERWRITE no SQL ou gravação de DataFrame com df.write.mode("overwrite"). Esse tipo de substituição só está disponível para computação clássica, não para databricks SQL warehouses ou computação sem servidor.
Configure o modo de substituição de partição dinâmica definindo a configuração de sessão do Spark spark.sql.sources.partitionOverwriteMode como dynamic. Como alternativa, você pode definir a opção DataFrameWriterpartitionOverwriteMode como dynamic. Se presente, a opção específica da consulta substitui o modo definido na configuração da sessão. O padrão para spark.sql.sources.partitionOverwriteMode é static.
O seguinte exemplo demonstra o uso do partitionOverwriteMode:
SQL
SET spark.sql.sources.partitionOverwriteMode=dynamic;
INSERT OVERWRITE TABLE default.people10m SELECT * FROM morePeople;
Python
(df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
)
Scala
df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
Tenha em mente as seguintes restrições e comportamentos para partitionOverwriteMode:
- Você não pode definir
overwriteSchemacomotrue. - Você não pode especificar ambos
partitionOverwriteModeereplaceWherena mesmaDataFrameWriteroperação. - Se você especificar uma
replaceWherecondição usando umaDataFrameWriteropção, o Delta Lake aplicará essa condição para controlar quais dados são substituídos. Essa opção tem precedência sobre a configuração no nível dapartitionOverwriteModesessão. - Sempre valide se os dados gravados alcançam apenas as partições esperadas. Uma única linha na partição errada pode acabar sobrescrevendo involuntariamente toda a partição.