Arquivos de dados compactos com otimização no Delta Lake

Consulte OTIMIZAR.

O Delta Lake no Databricks pode melhorar a velocidade da query de leitura de uma tabela. Uma maneira de melhorar essa velocidade é unir arquivos pequenos em arquivos maiores.

Observação

No Databricks Runtime 13.3 e acima, o Databricks recomenda o uso clusters para disposição da tabela Delta. Consulte Usar clusters líquidos para tabelas Delta.

A Databricks recomenda o uso da otimização preditiva para execução automática OPTIMIZE de tabelas Delta. Consulte Otimização preditiva para Delta Lake.

Exemplos de sintaxe

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

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

ou, alternativamente:

OPTIMIZE events
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
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:

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

Observação

  • A otimização de 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 balanceados uniformemente 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.

  • As APIs Python e Scala para executar operações OPTIMIZE estão disponíveis no Databricks Runtime 11.0e 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 OPTIMIZE?

Quando você escolhe a frequência de execução OPTIMIZE, há uma compensação entre desempenho e custo. Para obter um melhor desempenho query 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.

A Databricks recomenda que você comece executando OPTIMIZE diariamente (de preferência à noite, quando os preços spot estã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 execução OPTIMIZE (bin-packing e Z-ordering)?

Ambas as operações são operações intensivas da CPU que executam grandes quantidades de decodificação e codificação do Parquet.

Databricks recomenda tipos de instância otimizadoscompute . OPTIMIZE também se beneficia de SSDs conectados.