Teilen über


Bloom-Filterindizes

Ein Bloom-Filterindex ist eine raumeffiziente Datenstruktur, die das Überspringen von Daten in ausgewählten Spalten ermöglicht. Es ist besonders effektiv für Spalten mit vielen unterschiedlichen Werten, z. B. Freiformtext oder IDs.

Einschränkungen von Bloom-Filterindizes

Important

Azure Databricks empfiehlt die Verwendung von Bloom-Filterindizes für die meisten Workloads nicht.

Obwohl Bloom-Filterindizes das Überspringen von Daten auf Spalten mit hoher Kardinalität eindeutiger Werte unterstützen, verursachen sie häufig Probleme wie die folgenden:

  • Sie indexieren nur Dateien, die nach dem Erstellen des Indexes geschrieben wurden. Die Indizes gelten nicht für vorhandene Dateien.
  • Sie sind schwierig zu optimieren und fügen häufig Mehraufwand ohne erheblichen Leistungsvorteil hinzu.
  • Sie funktionieren am besten mit streng selektiven Gleichheitsfiltern in einer einzelnen Spalte. Sie bieten wenig bis keinen Vorteil für breitere Filter.
  • Bloom-Filterindizes funktionieren nur für explizit definierte Spalten. Wenn Ihre Abfragen mit dem Filtern nach Spalten beginnen, die sich nicht mit den Bloom-Filterindexspalten überlappen, müssen Sie den Index manuell ablegen und neu erstellen, wodurch der Betriebsaufwand hinzugefügt wird. Außerdem müssen Sie den neuen Index mit den neuen Daten neu erstellen.

Während Bloom-Filterindizes darauf abzielen, Dateilesevorgänge zu überspringen, muss Azure Databricks die Indexdatei weiterhin für jede Datendatei überprüfen. Z-Sortierung und Liquid Clustering sind effektiver, da sie der Engine ermöglichen, die Berücksichtigung der meisten Dateien zu vermeiden.

Azure Databricks empfiehlt die Verwendung der folgenden Features anstelle von Bloom-Filterindizes:

  • Predictive I/O – Bei Photon-fähigem Rechnen mit Databricks Runtime 12.2 und höher führt "predictive I/O" die Dateiüberspringung an allen Spalten mithilfe erweiterter Heuristik durch. Es umfasst vollständig die Bloom-Filterindizes, die lediglich zusätzlichen Schreibaufwand verursachen, wenn Photon aktiviert ist.
  • Flüssigkeitsclustering In Databricks Runtime 13.3 und höher verbessert das Flüssigclustering das Überspringen von Daten, indem Daten basierend auf häufig gefilterten Spalten organisiert werden. Es funktioniert bei einer groberen Granularität als Bloom-Filterindizes und ermöglicht Azure Databricks, ganze Gruppen von Dateien während der Abfrageplanung zu überspringen.

Important

Vermeiden Sie die Kombination von Bloom-Filter-Indizes mit prädiktivem I/O. Wenn beide aktiviert sind, haben Bloom-Filterindizes Vorrang und deaktivieren Predictive I/O, was eine schnellere und zuverlässigere Leistung ermöglicht.

Funktionsweise von Bloom-Filterindizes

Azure Databricks Bloom-Filterindizes bestehen aus einem Datensprungindex für jede Datendatei. Der Bloom-Filterindex kann verwendet werden, um zu bestimmen, dass ein Spaltenwert definitiv nicht in der Datei enthalten ist oder dass er wahrscheinlich in der Datei enthalten ist. Bevor eine Datei gelesen wird, überprüft Azure Databricks die Indexdatei, und die Datei wird nur dann gelesen, wenn der Index anzeigt, dass die Datei möglicherweise mit einem Datenfilter übereinstimmt.

Bloom-Filterindizes unterstützen Spalten mit den folgenden Eingabedatentypen: byte, , short, int, long, float, doubledate, , timestampund string. Nullen werden dem Bloom-Filterindex nicht hinzugefügt, sodass ein nullbezogener Filter das Lesen der Datendatei erfordert. Azure Databricks unterstützt die folgenden Datenquellenfilter: and, , or, in, und equalsequalsnullsafe. Bloom-Filterindizes werden für geschachtelte Spalten nicht unterstützt.

Konfiguration und Referenz

Verwenden Sie die folgende Syntax, um einen Bloom-Filter zu aktivieren:

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

Ausführliche Informationen zur Syntax finden Sie unter CREATE BLOOM FILTER INDEX und DROP BLOOM FILTER INDEX.

Um Bloom-Filtervorgänge zu deaktivieren, legen Sie die Konfiguration auf Sitzungsebene spark.databricks.io.skipping.bloomFilter.enabled auf false.

Liste der Bloom-Filterindizes anzeigen

Führen Sie Folgendes aus, um die Liste der Indizes anzuzeigen:

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

Beispiel:

Anzeigen von Indizes