Otimizar a disposição dos arquivos de dados
Otimização preditiva executando automaticamente OPTIMIZE
em Unity Catalog gerenciar tabelas. Databricks recomenda habilitar a otimização preditiva para todas as tabelas gerenciais do Unity Catalog para simplificar a manutenção de dados e reduzir os custos de armazenamento. Consulte Otimização preditiva para Unity Catalog gerenciar tabelas.
O comando OPTIMIZE
reescreve os arquivos de dados para melhorar a disposição dos dados nas tabelas do site Delta. Para tabelas com o clustering líquido ativado, OPTIMIZE
reescreve os arquivos de dados para agrupar os dados por chave do clustering líquido. Para tabelas com partições definidas, a compactação de arquivos e a disposição de dados são realizadas dentro das partições.
As tabelas sem clustering líquido podem, opcionalmente, incluir uma cláusula ZORDER BY
para melhorar o clustering de dados na reescrita. Databricks recomenda o uso do líquido clustering em vez de partições, ZORDER
ou outras abordagens de disposição de dados.
Consulte OPTIMIZE.
Em Databricks Runtime 16.0 e acima, o senhor pode usar OPTIMIZE FULL
para forçar o reclustering para tabelas com o clustering líquido ativado. Consulte Force reclustering para todos os registros.
Exemplos de sintaxe
O senhor aciona a compactação executando o comando OPTIMIZE
:
- SQL
- Python
- Scala
OPTIMIZE table_name
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Se você tiver uma grande quantidade de dados e quiser otimizar apenas um subconjunto deles, poderá especificar um predicado de partição opcional usando WHERE
:
- SQL
- Python
- Scala
OPTIMIZE table_name WHERE date >= '2022-11-18'
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
- A otimização do bin-packing é idempotente , o que significa que, se for executada duas vezes no mesmo dataset, a segunda execução não terá efeito.
- O bin-packing visa produzir arquivos de dados uniformemente balanceados em relação ao seu tamanho no disco, mas não necessariamente ao número de tuplas por arquivo. No entanto, as duas medidas são mais frequentemente correlacionadas.
- Python e Scala APIs para a execução de
OPTIMIZE
operações estão disponíveis em Databricks Runtime 11.3 LTS e acima.
Leitores de tabelas Delta usam isolamento Snapshot , o que significa que eles não são interrompidos quando OPTIMIZE
remove arquivos desnecessários dos logs de transação. OPTIMIZE
não faz alterações relacionadas a dados na tabela, portanto, uma leitura antes e depois de um OPTIMIZE
tem os mesmos resultados. Executar OPTIMIZE
em uma mesa que é uma fonte de transmissão não afeta nenhuma transmissão atual ou futura que trate esta mesa como uma fonte. OPTIMIZE
retorna as estatísticas do arquivo (min, max, total e assim por diante) para os arquivos removidos e os arquivos adicionados pelas operações. As estatísticas de otimização também contêm as estatísticas de Z-ordering, o número de lotes e as partições otimizadas.
Você também pode compactar arquivos pequenos automaticamente usando a compactação automática. Consulte Compactação automática para Delta Lake em Databricks.
Com que frequência devo executar o OPTIMIZE
?
Habilite a otimização preditiva para Unity Catalog gerenciar tabelas para garantir que OPTIMIZE
sejam executadas automaticamente quando for econômico.
Quando o senhor escolhe a frequência de execução do site OPTIMIZE
, há uma compensação entre desempenho e custo. Para melhorar o desempenho da consulta do usuário final, execute OPTIMIZE
com mais frequência. Isso acarretará um custo maior devido ao aumento do uso de recursos. Para otimizar o custo, execute-o com menos frequência.
Databricks recomenda que o senhor comece executando OPTIMIZE
diariamente (de preferência à noite, quando os preços spot são baixos) 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 Parquet decodificação e codificação.
Databricks recomenda a computação de tipos de instância otimizados. OPTIMIZE
também se beneficia do anexo SSD.