Compartilhar via


Otimizar o layout do arquivo de dados

A otimização preditiva é executada automaticamente OPTIMIZE em tabelas gerenciadas do Catálogo do Unity. O Databricks recomenda habilitar a otimização preditiva para todas as tabelas gerenciadas do Catálogo do Unity para simplificar a manutenção de dados e reduzir os custos de armazenamento. Consulte a Otimização preditiva para o Delta Lake.

O comando OPTIMIZE reescreve arquivos de dados para melhorar o layout de dados para tabelas Delta. Para tabelas com clustering líquido habilitado, OPTIMIZE reescreve arquivos de dados para agrupar dados por chaves de clustering líquido. Para tabelas com partições definidas, a compactação de arquivos e o layout de dados são executados em partições.

Tabelas sem clustering líquido podem incluir opcionalmente uma cláusula ZORDER BY para melhorar o clustering de dados na reescrita. O Databricks recomenda o uso de clustering líquido em vez de partições, ZORDER ou outras abordagens de layout de dados.

Confira OPTIMIZE.

Exemplos de sintaxe

Você dispara a compactação executando o comando OPTIMIZE:

SQL

OPTIMIZE delta.`/data/events`

Python

from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

ou, alternativamente:

SQL

OPTIMIZE events

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()

Se você tiver uma grande quantidade de dados e quiser apenas otimizar um subconjunto deles, poderá especificar um predicado de partição opcional usando WHERE:

SQL

OPTIMIZE events WHERE date >= '2022-11-18'

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Observação

  • A otimização de empacotamento de compartimentos é idempotente, o que significa que, se ela for executada duas vezes no mesmo conjunto de dados, a segunda não terá nenhum efeito.
  • O compartimento-empacotamento tem como objetivo produzir arquivos de dados balanceados de maneira equilibrada em relação ao tamanho no disco, mas não necessariamente o número de tuplas por arquivo. No entanto, as duas medidas são correlacionadas com mais frequência.
  • As APIs Python e Scala para executar a operação OPTIMIZE estão disponíveis no Databricks Runtime 11.3 LTS e superior.

Os leitores de tabelas Delta usam o isolamento de instantâneo, o que significa que eles não são interrompidos quando OPTIMIZE remove arquivos desnecessários do log de transações. OPTIMIZE não faz nenhuma alteração nos dados relacionada à tabela, ou seja, uma leitura antes e depois de OPTIMIZE gera os mesmos resultados. A execução de OPTIMIZE em uma tabela que seja uma origem de streaming não afeta nenhum fluxo atual ou futuro que trate essa tabela como uma origem. OPTIMIZE retorna as estatísticas de arquivo (mín, máx, total e assim por diante) para os arquivos removidos e adicionados pela operação. As estatísticas de otimização também contêm as estatísticas de Ordenação Z, o número de lotes e as partições otimizadas.

Você também pode compactar arquivos pequenos automaticamente com a compactação automática. Confira Compactação automática para o Delta Lake no Azure Databricks.

Com que frequência devo executar OPTIMIZE?

Habilite a otimização preditiva para tabelas gerenciadas do Catálogo do Unity para garantir que OPTIMIZE seja executado automaticamente quando for econômico.

Quando você escolhe a frequência de execução de OPTIMIZE, há uma compensação entre desempenho e custo. Para melhorar o desempenho de 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 otimizar o custo, execute-o com menos frequência.

O Databricks recomenda que você comece executando OPTIMIZE diariamente e ajuste a frequência para equilibrar as compensações de custo e desempenho.

Qual é o melhor tipo de instância para executar OPTIMIZE (compartimento-empacotamento e Ordenação Z)?

Ambas as operações têm uso intensivo de CPU porque envolvem grandes quantidades de decodificação e codificação de Parquet.

O Databricks recomenda tipos de instância otimizada para computação. OPTIMIZE também se beneficia de SSDs anexados.