Partilhar via


Otimizar o layout do arquivo de dados

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

O OPTIMIZE comando reescreve ficheiros de dados para melhorar o layout dos dados das tabelas. Para tabelas com clustering líquido habilitado, OPTIMIZE regrava 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 realizados dentro de partições.

As tabelas sem aglomeração líquida podem, opcionalmente, incluir uma cláusula ZORDER BY para melhorar a aglomeração de dados durante a regravação. O Databricks recomenda o uso de "liquid clustering" em vez de partições ZORDER ou de outras abordagens de disposição de dados.

Nota

ZORDER é uma otimização específica do Lago Delta. As tabelas Apache Iceberg utilizam em vez disso estratégias de agrupamento e ordenação.

Ver OPTIMIZE.

Importante

No Databricks Runtime 16.0 e superior, você pode usar OPTIMIZE FULL para forçar o reagrupamento de tabelas com clustering líquido habilitado. Consulte Forçar o reagrupamento de todos os registos.

Exemplos de sintaxe

Acione a compactação executando o OPTIMIZE comando:

SQL

OPTIMIZE table_name

Python

A API DeltaTable em Python é específica para o Delta Lake.

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

linguagem de programação Scala

A API Scala DeltaTable é específica para Delta Lake.

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

Se tiver uma grande quantidade de dados e só quiser otimizar um subconjunto deles, especifique um predicado de partição opcional usando WHERE:

SQL

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

Python

A API DeltaTable em Python é específica para o Delta Lake.

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

linguagem de programação Scala

A API Scala DeltaTable é específica para Delta Lake.

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.
  • O objetivo do bin-packing é produzir arquivos de dados que estejam equilibrados com relação ao seu tamanho no disco, mas não necessariamente quanto ao 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 de tabelas Delta usam 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 na tabela, portanto, uma leitura antes e depois de um OPTIMIZE tem os mesmos resultados. O desempenho OPTIMIZE em uma tabela que é uma fonte de streaming não afeta nenhum fluxo atual ou futuro que trate essa tabela 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. Otimize stats também contém as estatísticas Z-Ordering, o número de lotes e partições otimizadas.

Você também pode compactar pequenos arquivos automaticamente usando a compactação automática. Ver Compactação automática.

Com que frequência devo correr OPTIMIZE?

Habilite a otimização preditiva para tabelas geridas do Unity Catalog para garantir que OPTIMIZE seja executado automaticamente quando for economicamente viável.

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 otimizar os custos, 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 tipo de instância mais indicado para executar OPTIMIZE (bin-packing e Z-Ordering)?

Ambas as operações são operações intensivas de CPU que envolvem grandes quantidades de descodificação e codificação Parquet.

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