Pular para o conteúdo principal

Índices de filtro Bloom

Um índice de filtro Bloom é uma estrutura de dados com eficiência de espaço que permite pular dados nas colunas escolhidas. É especialmente eficaz para colunas com muitos valores distintos, como texto ou IDs de formato livre.

Limitações dos índices do filtro Bloom

important

A Databricks não recomenda o uso de índices de filtro Bloom para a maioria das cargas de trabalho.

Embora os índices de filtro Bloom ofereçam suporte ao salto de dados em colunas com alta cardinalidade de valores exclusivos, eles geralmente apresentam problemas como os seguintes:

  • Eles só indexam arquivos gravados após a criação do índice. Os índices não se aplicam aos arquivos existentes.
  • São difíceis de ajustar e, muitas vezes, aumentam a sobrecarga sem oferecer benefícios significativos de desempenho.
  • Eles funcionam melhor com filtros de igualdade altamente seletivos em uma única coluna. Eles oferecem pouco ou nenhum benefício para filtros mais amplos.
  • Os índices do filtro Bloom só funcionam em colunas definidas explicitamente. Se suas consultas começarem a filtrar colunas que não se sobrepõem às colunas do índice do filtro Bloom, será necessário excluir e recriar manualmente o índice, adicionando sobrecarga operacional. Você também precisa reconstruir o novo índice do zero com os novos dados.

Embora os índices do filtro Bloom tenham como objetivo ignorar a leitura de arquivos, o Databricks ainda precisa verificar o arquivo de índice para cada arquivo de dados. Z-ordering e o líquido clustering são mais eficazes porque permitem que o motor ignore a maioria dos arquivos.

Alternativas recomendadas

Databricks Recomenda-se utilizar o seguinte recurso em vez dos índices do filtro Bloom:

  • E/S preditiva - No compute habilitado para Photon com Databricks Runtime 12.2 e superior, a E/S preditiva realiza o pulo de arquivos em todas as colunas usando heurística avançada. Ele inclui totalmente os índices do filtro Bloom, que apenas adicionam sobrecarga de gravação quando o Photon está ativado.
  • clusteringlíquido No Databricks Runtime 13.3 e acima, o clustering líquido melhora a omissão de dados, organizando-os com base nas colunas filtradas com mais frequência. Ele funciona com uma granularidade mais grosseira do que os índices do filtro Bloom e permite que o Databricks ignore grupos inteiros de arquivos durante o planejamento da consulta.
important

Evite combinar índices de filtro Bloom com E/S preditiva. Quando ambos estão ativados, os índices do filtro Bloom têm precedência e desativam a E/S preditiva, o que proporciona um desempenho mais rápido e confiável.

Como funcionam os índices de filtro Bloom

Os índices de filtro de Bloom do Databricks consistem em um índice de omissão de dados para cada arquivo de dados. O índice do filtro Bloom pode ser usado para determinar se o valor de uma coluna definitivamente não está no arquivo ou se provavelmente está no arquivo. Antes de ler um arquivo, o Databricks verifica o arquivo de índice e o arquivo é lido somente se o índice indicar que o arquivo pode corresponder a um filtro de dados.

Os índices de filtro Bloom suportam colunas com os seguintes tipos de dados de entrada: byte, short, int, long, float, double, date, timestamp e string. Os nulos não são adicionados ao índice do filtro Bloom, portanto, qualquer filtro relacionado a nulos exige a leitura do arquivo de dados. Databricks Suporta os seguintes filtros de fonte de dados: and, or, in, equals e equalsnullsafe. Os índices do filtro Bloom não são suportados em colunas aninhadas.

Configuração e referência

Use a sintaxe a seguir para ativar um filtro Bloom:

SQL
CREATE BLOOMFILTER INDEX
ON TABLE table_name
FOR COLUMNS(column_name OPTIONS (fpp=0.1, numItems=5000))

Para obter detalhes de sintaxe, consulte CREATE BLOOM FILTER INDEX e DROP BLOOM FILTER INDEX.

Para desativar as operações do filtro Bloom, defina a configuração de nível de sessão spark.databricks.io.skipping.bloomFilter.enabled como false.

Exibir a lista de índices do filtro Bloom

Para exibir a lista de índices, execute:

Scala
spark.table("<table-with-indexes>").schema.foreach(field => println(s"${field.name}: metadata=${field.metadata}"))

Por exemplo:

Mostrar índices