Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Delta Lake tem as seguintes opções específicas para sobrescrições seletivas:
- A
replaceWhereopção substitui 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 o uso replaceWhere para especificar quais dados devem ser substituídos.
Important
Se os dados tiverem sido substituídos acidentalmente, você poderá usar restaurar para desfazer a alteração.
Substituição arbitrária seletiva com replaceWhere
Você pode substituir seletivamente apenas os dados que correspondem a uma expressão arbitrária.
Note
SQL requer Databricks Runtime 12.2 LTS ou superior.
Por exemplo, substituir atomicamente os eventos em janeiro na tabela alvo, que é particionada por start_date, com os dados em replace_data.
Python
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("events")
)
Scala
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("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 que todas as linhas correspondem ao predicado, e executa uma substituição atómica usando a semântica de overwrite. Se quaisquer valores na operação estiverem fora da restrição, essa operação falhará com um erro por padrão.
Você pode alterar esse comportamento para overwrite valores dentro do intervalo de predicados e insert registros que estão fora do intervalo especificado. Para fazer isso, desative 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
Note
REPLACE WHERE aceita um/uma boolean_expression com algumas restrições. Consulte INSERT na referência da linguagem SQL.
Comportamento herdado
Se usares o comportamento legado de replaceWhere, as consultas só correspondem a predicados sobre colunas de partição e ignoram quaisquer dados fora do intervalo de predicados. O comando seguinte substituiria atomicamente o mês de janeiro na tabela alvo, que é particionada por date, com os dados em df:
Python
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
Para usar o comportamento legado, defina a spark.databricks.delta.replaceWhere.dataColumns.enabled flag para false:
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ção dinâmica
Atualização dinâmica de partições por sobrescrição atualiza apenas as partições onde o registo de novos dados é efetuado, mantendo as outras partições inalteradas.
Azure Databricks recomenda REPLACE USING para ativar sobrescrições dinâmicas de partições. Este modo funciona em todos os tipos de computação, incluindo Databricks SQL warehouses, computação serverless e computação clássica, e não exige que definas uma configuração de sessão Spark. Veja Substituição de partições dinâmicas com REPLACE USING.
partitionOverwriteMode é um modo legado para sobrescrevimentos dinâmicos de partições que exige que uses computação clássica e definas uma configuração de sessão Spark. Não é suportado em Databricks SQL ou computação sem servidor. Ver Partições dinâmicas sobrescritas com partitionOverwriteMode (legado).
As secções abaixo demonstram como usar cada modo.
A partição dinâmica substitui com REPLACE USING
O Databricks Runtime 16.3 e superiores suporta sobrescrições dinâmicas de partições para tabelas que utilizam REPLACE USING. Pode sobrescrever seletivamente dados em todos os tipos de computação, sem necessidade de definir uma configuração de sessão Spark.
REPLACE USING permite um comportamento de substituição atómica independente de computação, que funciona em armazéns de dados SQL do Databricks, em computação sem servidor e em computação clássica.
REPLACE USING apenas substitui as partições alvo dos dados recebidos. Todas as outras partições permanecem inalteradas.
REPLACE USING é suportado apenas em SQL. Para obter detalhes, consulte INSERT a referência da linguagem SQL.
Os seguintes exemplos utilizam REPLACE USING:
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
Tenha em mente as seguintes restrições e comportamentos para substituições de partições dinâmicas:
- No Databricks Runtime 17.2 e versões posteriores, são suportadas tabelas particionadas, tabelas não particionadas e tabelas com clustering líquido.
- No Databricks Runtime 16.3 a 17.1, apenas as tabelas particionadas são suportadas e deve especificar o conjunto completo das colunas de partição da tabela na
USINGcláusula. - Verifique sempre que os dados escritos abrangem apenas as partições esperadas. Uma única linha na partição errada pode sobrepor involuntariamente toda a partição.
Caso necessite de uma lógica de correspondência mais personalizável do que a suportada pelo REPLACE USING, como tratar os valores de NULL como iguais, utilize o complemento REPLACE ON. Consulte INSERT para obter detalhes.
A partição dinâmica substitui por partitionOverwriteMode (legado)
O Databricks Runtime 11.3 LTS e superior suporta a substituição dinâmica de partições para tabelas particionadas usando o modo de substituição: INSERT OVERWRITE em SQL ou em uma escrita de DataFrame com df.write.mode("overwrite"). Esse tipo de substituição só está disponível para computação clássica, não para armazéns SQL Databricks ou computação sem servidor.
Advertência
Sempre que possível, use INSERT OVERWRITE REPLACE USING em vez de sobrescrever INSERT OVERWRITE PARTITION partições e spark.sql.sources.partitionOverwriteMode=dynamic. A sobreposição de partições pode usar dados obsoletos quando há alterações na partição.
Para usar o modo de sobrescrição dinâmica de partições, defina a configuração spark.sql.sources.partitionOverwriteMode da sessão Spark para dynamic. Como alternativa, você pode definir a DataFrameWriter opção partitionOverwriteMode como dynamic. Se presente, a opção específica da consulta substitui o modo definido na configuração da sessão. O valor padrão para spark.sql.sources.partitionOverwriteMode é static.
O exemplo a seguir usa 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:
- Não é possível definir
overwriteSchemacomotrue. - Não é possível 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 serão substituídos. Esta opção tem precedência sobre a configuração a nível de sessãopartitionOverwriteMode. - Verifique sempre que os dados escritos abrangem apenas as partições esperadas. Uma única linha na partição errada pode sobrepor involuntariamente toda a partição.