Substituir seletivamente os dados com o Delta Lake
O Delta Lake oferece as seguintes opções distintas para sobrescritas 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, a Databricks recomenda usar replaceWhere para especificar quais dados devem ser substituídos.
Se os dados tiverem sido sobrescritos acidentalmente, você poderá usar a restauração para desfazer a alteração.
Substituição seletiva arbitrária por replaceWhere
Você pode substituir seletivamente somente os dados que correspondam a uma expressão arbitrária.
SQL requer Databricks Runtime 12.2 LTS ou acima.
Por exemplo, substituir atomicamente os eventos em janeiro na tabela de destino, que é particionada por start_date, pelos dados em replace_data.
- Python
- Scala
- SQL
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("events")
)
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("events")
INSERT INTO TABLE events REPLACE WHERE start_date >= '2017-01-01' AND end_date <= '2017-01-31' SELECT * FROM replace_data
Esse 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 nas operações estiver fora da restrição, essa operação falhará com um erro em default.
Você pode alterar esse comportamento para valores overwrite 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
- Scala
- SQL
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", False)
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", false)
SET spark.databricks.delta.replaceWhere.constraintCheck.enabled=false
REPLACE WHERE aceita um boolean_expression com algumas restrições. Consulte INSERT na referência da linguagem SQL.
Comportamento legado
Se você usar o comportamento legado de replaceWhere, as consultas sobrescreverão os dados que correspondem a um predicado apenas nas colunas de partição. O seguinte comando substituiria atomicamente o mês de janeiro na tabela de destino, que está particionada por date, pelos dados em df:
- Python
- Scala
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
)
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
Para usar o comportamento legado, defina o sinalizador spark.databricks.delta.replaceWhere.dataColumns.enabled como false:
- Python
- Scala
- SQL
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", False)
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", false)
SET spark.databricks.delta.replaceWhere.dataColumns.enabled=false
Sobrescreve partições dinâmicas
A sobrescrita dinâmica de partições atualiza apenas as partições onde a gravação confirma novos dados, deixando as demais partições inalteradas.
A Databricks recomenda REPLACE USING para acionar sobrescritas dinâmicas de partições. Este modo funciona em todos os tipos compute , incluindo data warehouses Databricks SQL , compute serverless e compute clássica, e não exige que você configure uma sessão Spark . Veja Sobrescritas de partição dinâmica com REPLACE USING.
partitionOverwriteMode É um modo legado para sobrescrita dinâmica de partições que exige o uso compute clássica e a configuração de uma sessão Spark . Não é compatível com Databricks SQL ou compute serverless . Consulte Sobrescritas de partição dinâmica com partitionOverwriteMode (legado).
As seções abaixo demonstram como usar cada modo.
A partição dinâmica sobrescreve com REPLACE USING
Databricks Runtime 16.3 e versões superiores suportam sobrescritas dinâmicas de partições para tabelas usando REPLACE USING. Você pode sobrescrever dados seletivamente em todos os tipos compute , sem precisar configurar uma sessão Spark . REPLACE USING permite comportamento de sobrescrita atômica independente computeque funciona em data warehouses Databricks SQL , compute serverless e compute clássica.
REPLACE USING sobrescreve apenas as partições de destino dos dados recebidos. Todas as outras partições permanecem inalteradas.
REPLACE USING Só é suportado em SQL. Para obter detalhes, consulte INSERT na referência da linguagem SQL.
Os exemplos a seguir usam REPLACE USING:
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
Lembre-se das seguintes restrições e comportamentos para substituições dinâmicas de partições:
- Você deve especificar o conjunto completo das colunas de partição da tabela na cláusula
USING. - Sempre valide se os dados gravados tocam somente nas partições esperadas. Uma única linha na partição errada pode, sem querer, sobrescrever a partição inteira.
Se você precisar de uma lógica de correspondência mais personalizável do que a que REPLACE USING suporta, como tratar os valores de NULL como iguais, use o REPLACE ON complementar. Consulte INSERT para obter detalhes.
A partição dinâmica sobrescreve com partitionOverwriteMode (legacy)
Visualização
Esse recurso está em Public Preview.
Databricks Runtime 11.3 O LTS e acima suportam sobrescritas dinâmicas de partições para tabelas particionadas usando o modo de sobrescrita: INSERT OVERWRITE em SQL ou uma gravação DataFrame com df.write.mode("overwrite"). Este tipo de substituição está disponível apenas para armazéns clássicos compute, não para armazéns Databricks SQL ou serverless compute.
Quando possível, use INSERT REPLACE USING em vez de sobrescrever a partição INSERT OVERWRITE PARTITION e spark.sql.sources.partitionOverwriteMode=dynamic. A sobrescrita de partições pode usar dados obsoletos quando as configurações de particionamento são alteradas.
Para usar o modo de sobrescrita de partição dinâmica, defina a configuração da sessão Spark de spark.sql.sources.partitionOverwriteMode para dynamic. Alternativamente, você pode definir a opção DataFrameWriter partitionOverwriteMode para dynamic. Caso esteja presente, a opção específica da consulta substitui o modo definido na configuração da sessão. O valor default para spark.sql.sources.partitionOverwriteMode é static.
O exemplo a seguir usa partitionOverwriteMode:
- SQL
- Python
- Scala
SET spark.sql.sources.partitionOverwriteMode=dynamic;
INSERT OVERWRITE TABLE default.people10m SELECT * FROM morePeople;
(df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
)
df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
Lembre-se das seguintes restrições e comportamentos para partitionOverwriteMode:
- Você não pode definir
overwriteSchemacomotrue. - Não é possível especificar
partitionOverwriteModeereplaceWherenas mesmas operaçõesDataFrameWriter. - Se você especificar uma condição
replaceWhereusando uma opçãoDataFrameWriter, o Delta Lake aplicará essa condição para controlar quais dados serão sobrescritos. Essa opção tem precedência sobre a configuraçãopartitionOverwriteModeem nível de sessão. - Sempre valide se os dados gravados tocam somente nas partições esperadas. Uma única linha na partição errada pode, sem querer, sobrescrever a partição inteira.