Optimize layout do arquivo de dados
A otimização preditiva executa-se automaticamente OPTIMIZE
no Unity Catalog gerenciado tables. A Databricks recomenda ativar a otimização preditiva para todos os Unity Catalog geridos tables, para simplificar a manutenção de dados e reduzir os custos de armazenamento. Consulte Otimização preditiva para Unity Catalog gerenciado tables.
O comando OPTIMIZE
regrava arquivos de dados para melhorar o layout de dados para Delta tables. Para tables com clustering líquido habilitado, OPTIMIZE
regrava arquivos de dados para agrupar dados por chaves de clustering líquido. Para tables com partições definidas, a compactação de arquivos e o layout de dados são realizados dentro de partições.
Tables sem agrupamento contínuo pode, opcionalmente, incluir uma cláusula ZORDER BY
para melhorar o agrupamento de dados ao reescrever. O Databricks recomenda o uso de clustering líquido em vez de partições ZORDER
ou outras abordagens de layout de dados.
Ver OPTIMIZE.
Importante
Na Databricks Runtime 16.0 ou superior, você pode usar OPTIMIZE FULL
para forçar o reagrupamento de tables com clustering líquido habilitado. Consulte Força reagrupamento para todos os registros.
Exemplos de sintaxe
Você aciona a compactação executando o OPTIMIZE
comando:
SQL
OPTIMIZE table_name
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Scala
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Se você tiver uma grande quantidade de dados e quiser optimize apenas um subconjunto deles, poderá especificar um predicado partition opcional usando WHERE
:
SQL
OPTIMIZE table_name WHERE date >= '2022-11-18'
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Scala
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Nota
- A otimização de empacotamento de compartimentos é idempotente, o que significa que, se for executada duas vezes no mesmo conjunto de dados, a segunda execução não terá efeito.
- Bin-packing visa produzir arquivos de dados equilibrados em relação ao seu tamanho no disco, mas não necessariamente o número de tuplas por arquivo. No entanto, as duas medidas estão mais frequentemente correlacionadas.
- As APIs Python e Scala para execução
OPTIMIZE
de operações estão disponíveis no Databricks Runtime 11.3 LTS e superior.
Os leitores do Delta tables utilizam isolamento de instantâneos, o que significa que não são interrompidos quando OPTIMIZE
remove arquivos desnecessários do log de transações.
OPTIMIZE
não faz alterações relacionadas a dados no table, portanto, uma leitura antes e depois de um OPTIMIZE
tem os mesmos resultados. Executar OPTIMIZE
em um table que é uma fonte de streaming não afeta nenhum fluxo atual ou futuro que trate esse table como uma fonte.
OPTIMIZE
Retorna as estatísticas de arquivo (min, max, total e assim por diante) para os arquivos removidos e os arquivos adicionados pela operação.
Optimize estatísticas também contêm as estatísticas Z-Ordering, bem como o número de lotes e as partições otimizadas.
Você também pode compactar pequenos arquivos automaticamente usando a compactação automática. Consulte Compactação automática para Delta Lake no Azure Databricks.
Com que frequência devo correr OPTIMIZE
?
Habilite a otimização preditiva para tables gerenciados do Unity Catalog para garantir que OPTIMIZE
seja executado automaticamente quando for econômico.
Quando você escolhe a frequência de execução OPTIMIZE
, há um trade-off entre desempenho e custo. Para um melhor desempenho da consulta do usuário final, execute OPTIMIZE
com mais frequência. Isso incorrerá em um custo mais alto devido ao aumento do uso de recursos. Para optimize custo, execute-o com menos frequência.
O Databricks recomenda que você comece executando OPTIMIZE
diariamente e, em seguida, ajuste a frequência para equilibrar as compensações de custo e desempenho.
Qual é o melhor tipo de instância para executar OPTIMIZE
(bin-packing e Z-Ordering)?
Ambas as operações são operações intensivas de CPU que fazem grandes quantidades de descodificação e codificação parquet.
O Databricks recomenda tipos de instância otimizados para computação.
OPTIMIZE
também beneficia das SSD ligadas.