ブルーム フィルター インデックス
ブルーム フィルター インデックスは、選択した列でデータをスキップできるスペース効率の高いデータ構造です。これは、自由形式のテキストや ID など、多くの異なる値を持つ列に特に効果的です。
ブルームフィルターインデックスの制限
Databricks では、ほとんどのワークロードにブルーム フィルター インデックスを使用することはお勧めしません。
ブルーム フィルター インデックスは、一意の値のカーディナリティが高い列でのデータ スキップをサポートしていますが、多くの場合、次のような問題が発生します。
- インデックスが作成された後に書き込まれたファイルのみにインデックスを付けます。インデックスは既存のファイルには適用されません。
- これらは調整が難しく、多くの場合、パフォーマンスに大きなメリットをもたらすことなくオーバーヘッドが追加されます。
- これらは、1 つの列で選択性の高い等価フィルターで最適に機能します。これらは、より広範なフィルターにほとんどまたはまったくメリットがありません。
- ブルーム フィルター インデックスは、明示的に定義された列でのみ機能します。クエリがブルーム フィルター インデックス列と重複しない列でフィルター処理を開始する場合は、インデックスを手動で削除して再作成する必要があり、運用上のオーバーヘッドが追加されます。また、新しいデータを使用して新しいインデックスを最初から再構築する必要があります。
ブルーム フィルター インデックスはファイルの読み取りをスキップすることを目的としていますが、Databricks はすべてのデータ ファイルについてインデックス ファイルをスキャンする必要があります。Z-Ordering とリキッドクラスタリングは、エンジンがほとんどのファイルを考慮せずに済むため、より効果的です。
推奨される代替案
Databricks では、ブルーム フィルター インデックスの代わりに次の機能を使用することをお勧めします。
- 予測I/O - Databricks Runtime 12.2以降のPhoton対応コンピュートでは、予測I/Oは高度なヒューリスティックを使用してすべての列でファイルスキップを実行します。 ブルームフィルターインデックスを完全に包含し、Photonが有効になっている場合にのみ書き込みオーバーヘッドを追加します。
- リキッドクラスタリングDatabricks Runtime 13.3以降では、リキッドクラスタリングは、頻繁にフィルタリングされる列に基づいてデータを整理することで、データのスキップを改善します。ブルーム フィルター インデックスよりも粗い粒度で動作し、Databricks はクエリ計画中にファイルのグループ全体をスキップできます。
ブルーム フィルター インデックスを予測 I/O と組み合わせないでください。両方を有効にすると、ブルーム フィルター インデックスが優先され、予測 I/O が無効になり、より高速で信頼性の高いパフォーマンスが実現します。
ブルーム フィルター インデックスのしくみ
Databricks ブルーム フィルター インデックスは、各データ ファイルのデータ スキップ インデックスで構成されます。 ブルーム フィルター インデックスを使用すると、列の値がファイルに明確に 存在しない か、またはファイル 内にある可能性がある かを判断できます。 ファイルを読み取る前に、Databricks はインデックス ファイルをチェックし、ファイルがデータ フィルターに一致する可能性があることをインデックスが示している場合にのみ、ファイルが読み取られます。
ブルームフィルターインデックスは、 byte
、 short
、 int
、 long
、 float
、 double
、 date
、 timestamp
、および string
の入力データ型を持つ列をサポートします。Null はブルーム フィルター インデックスに追加されないため、null 関連のフィルターではデータ ファイルを読み取る必要があります。Databricks は、 and
、 or
、 in
、 equals
、および equalsnullsafe
のデータソースフィルターをサポートしています。 ブルーム フィルター インデックスは、入れ子になった列ではサポートされていません。
構成と参照
次の構文を使用して、ブルームフィルターを有効にします。
CREATE BLOOMFILTER INDEX
ON TABLE table_name
FOR COLUMNS(column_name OPTIONS (fpp=0.1, numItems=5000))
構文の詳細については、 CREATE BLOOM FILTER INDEX と DROP BLOOM FILTER INDEX を参照してください。
ブルームフィルター操作を無効にするには、セッションレベル spark.databricks.io.skipping.bloomFilter.enabled
設定を false
に設定します。
ブルームフィルターインデックスのリストを表示します
インデックスのリストを表示するには、次のコマンドを実行します。
spark.table("<table-with-indexes>").schema.foreach(field => println(s"${field.name}: metadata=${field.metadata}"))
例えば: