Partilhar via


Sobrescrever dados seletivamente com o Delta Lake

O Delta Lake tem as seguintes opções específicas para sobrescrições seletivas:

  • A replaceWhere opçã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 USING clá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)

Important

Este recurso está no Public Preview.

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 overwriteSchema como true.
  • Não é possível especificar ambos partitionOverwriteMode e replaceWhere na mesma DataFrameWriter operação.
  • Se você especificar uma replaceWhere condição usando uma DataFrameWriter opçã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ão partitionOverwriteMode.
  • 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.