Salto de ficheiros para tabelas Delta

O ignoramento de ficheiros é uma otimização de leitura do Delta Lake que permite ao motor Spark evitar analisar ficheiros de dados que não podem conter linhas coincidentes. Como o motor lê menos dados, as consultas correm mais rápido e consomem menos recursos de I/O.

Como funciona o salto de ficheiros

Sempre que um ficheiro de dados é escrito numa tabela Delta, o Delta Lake regista estatísticas de coluna por ficheiro no registo de transações. Estas estatísticas incluem o valor mínimo, valor máximo e contagem nula para cada coluna indexada nesse ficheiro.

Quando uma consulta inclui um predicado de filtro, o motor compara o valor do predicado com o intervalo mínimo/máximo armazenado para cada ficheiro. Se o valor do predicado estiver fora do intervalo de um ficheiro, esse ficheiro é completamente ignorado — não há necessidade de o abrir ou escanear.

Por exemplo, considere uma sales tabela particionada em cinco ficheiros de dados por intervalos de datas:

File Estatísticas mín./máx. Resultado para WHERE date = '2024-03-15'
Arquivo 1 date [2024-01-01 .. 2024-02-28] Omitida
Arquivo 2 date [2024-03-01 .. 2024-03-31] Leia ✓
Ficheiro 3 date [2024-04-01 .. 2024-05-31] Omitida
Ficheiro 4 date [2024-06-01 .. 2024-07-31] Omitida
Ficheiro 5 date [2024-08-01 .. 2024-09-30] Omitida

Neste caso, quatro em cada cinco ficheiros são ignorados — 80% menos dados digitalizados — porque os seus intervalos mínimos/máximos não coincidem com o valor do filtro.

Importante

O tipo de dado do valor do predicado deve corresponder ao tipo de coluna. Um desajuste de tipo pode impedir que o motor utilize estatísticas ao nível do ficheiro para saltar.

Comportamento padrão

A Delta Lake recolhe automaticamente estatísticas de ficheiros com os seguintes predefinidos:

  • Apenas as primeiras 32 colunas (por posição ordinal) têm estatísticas recolhidas.
  • Estatísticas monitorizadas por coluna por ficheiro: contagem mínima, máxima e nula
  • Recolher estatísticas em colunas longas é dispendioso e acrescenta sobrecarga de escrita, por isso o posicionamento é importante.

A delta.dataSkippingNumIndexedCols propriedade da tabela controla o limite da coluna. Colunas acima desse limiar não recebem estatísticas ao nível do ficheiro e não podem participar no salto de ficheiros.

Tipos de dados elegíveis

Nem todos os tipos de coluna suportam estatísticas ao nível do ficheiro e, portanto, o salto de ficheiros. O motor avalia o tipo de dados de cada coluna para determinar se é possível recolher estatísticas mínimas ou máximas.

Sempre elegível (tipos atómicos)

  • NumericType(ByteType, ShortType, IntegerType, LongType, FloatType, DoubleType, ) DecimalType
  • DateType
  • TimestampType
  • TimestampNTZType
  • StringType

Elegível condicionalmente

Note

Os seguintes tipos podem ser ativados a partir da versão 2.0 do runtime Fabric Spark (Delta 4.1)

  • VariantType: quando spark.databricks.delta.variantShredding.collectVariantDataSkippingStats está ativado.
  • ArrayType: quando spark.microsoft.delta.skipping.complexTypes.enabled está ativado e o tipo de elemento é ele próprio elegível.
  • MapType: quando spark.microsoft.delta.skipping.complexTypes.enabled está ativado e tanto os tipos de chave como de valor são elegíveis.

Não elegível

  • BinaryType
  • BooleanType
  • StructType (no seu conjunto — os campos foliares dentro das estruturas são avaliados individualmente)
  • NullType

Maximizar a cobertura das colunas

Para obter o máximo benefício ao ignorar ficheiros, certifique-se de que as colunas pelas quais filtra com mais frequência estão abrangidas pelas estatísticas dos ficheiros.

Posicione primeiro as colunas frequentemente filtradas

Coloque as colunas que aparecem mais frequentemente em WHERE cláusulas, chaves de junção e predicados de filtro nas primeiras 32 posições ordinais do esquema da tabela. Mova colunas de cadeias de caracteres longas ou colunas de baixa seletividade para além da posição 32, para evitar desperdiçar sobrecarga de gravação em estatísticas que raramente ajudam.

ALTER TABLE table_name ALTER COLUMN long_str_col AFTER last_indexed_col

Aumentar o número de colunas indexadas

Se a sua tabela tiver mais de 32 colunas que beneficiam das estatísticas, aumente o limite padrão:

ALTER TABLE table_name SET TBLPROPERTIES ('delta.dataSkippingNumIndexedCols' = '40')

Note

Aumentar o número de colunas indexadas adiciona sobrecarga de escrita para cada ficheiro de dados. Só aumente este valor quando as colunas extra forem frequentemente usadas em predicados de filtro.

Especifique colunas exatas para estatística

Use delta.dataSkippingStatsColumns para controlar explicitamente quais as colunas que recebem estatísticas do ficheiro, independentemente da posição ordinal:

ALTER TABLE table_name SET TBLPROPERTIES ('delta.dataSkippingStatsColumns' = 'col1,col2')

Quando delta.dataSkippingStatsColumns está definido, apenas são recolhidas estatísticas das colunas especificadas. Esta abordagem dá-lhe um controlo preciso sobre o equilíbrio entre o custo de escrita e o benefício na leitura.

Combinar o salto de ficheiros com o layout dos dados

O salto de ficheiros funciona melhor quando valores relacionados estão colocalizados nos mesmos ficheiros. Técnicas como ZORDER BY o agrupamento de líquidos reorganizam fisicamente os dados para que linhas com valores de coluna semelhantes acabem nos mesmos ficheiros. Colocar valores semelhantes aperta os intervalos mínimos/máximos por ficheiro, o que aumenta a percentagem de ficheiros que o motor pode saltar para um determinado filtro.

Para mais informações sobre otimização do layout de dados, veja Compactação de Tabelas, Agrupamento de Líquidos e Ordem Z.