Bloom filter indexes | Databricks on AWS [2022/9/8時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
Bloomフィルターインデックスは、特に任意のテキストを含むフィールドなど、特定のカラムのデータスキッピングを可能にする空間効率性の高いデータ構造です。
Bloomフィルターインデックスの動作原理
Bloomフィルターは、定義された偽陽性の確率(FPP)を用いて、確実にファイルにデータが無い、あるいは、おそらくファイルにあるということを宣言することでオペレーションを行います。
DatabricksではファイルレベルのBloomフィルター、それぞれのデータファイルには、関連づけられた単一のBloomフィルターインデックスファイルが割り当てられます。ファイルを読み込む前に、Databricksはインデックスファイルをチェックし、インデックスによってファイルがデータフィルターにマッチするかもしれないということが示された場合にのみファイルが読み込まれます。インデックスが存在しない、あるいはクエリーされたカラムにBloomフィルターが定義されていない場合、Databricksは常にデータファイルを読み込みます。
Bloomフィルターのサイズは、Bloomフィルターを作成したセット内のエレメント数と必要となるFPPに依存します。FPPが低いほど、エレメントごとに使用されるビットの数は高くなり精度は高まりますが、ディスク容量を多く消費し、ダウンロードが遅くなります。例えば、FPP10%にはエレメントあたり5ビットが必要となります。
Bloomフィルターインデックスは非圧縮のParquetファイルであり、単一の行を保持します。インデックスは、データファイル内のサブディレクトリ_delta_index
に格納され、サフィックスindex.v1.parquet
が追加されたデータファイルと同じ名称を使用します。例えば、データファイルdbfs:/db1/data.0001.parquet.snappy
のインデックスの名前はdbfs:/db1/_delta_index/data.0001.parquet.snappy.index.v1.parquet
となります。
Bloomフィルターは、以下の(入力)データタイプのカラムをサポートします:byte
、short
、int
、long
、float
、double
、date
、timestamp
、string
。NullはBloomフィルターに追加されませんので、Nullに関係するフィルターの場合は常にデータファイルを読み込みます。Databricksでは、以下のデータソースのフィルターをサポートしています:and
、or
、in
、equals
、equalsnullsafe
。Bloomフィルターはネストされたカラムではサポートされません。
設定とリファレンス
Bloomフィルターはデフォルトで有効化されています。Bloomフィルターを無効化するには、セッションレベルで設定spark.databricks.io.skipping.bloomFilter.enabled
をfalse
に設定します。
- CREATE BLOOM FILTER INDEX (Delta Lake on Databricks)
- DROP BLOOM FILTER INDEX (Delta Lake on Databricks)
Bloom filter indexの一覧表示
インデックスの一覧を表示するには、以下を実行します。
spark.table("<table-with-indexes>").schema.foreach(field => println(s"${field.name}: metadata=${field.metadata}"))
ノートブック
以下のノートブックでは、Bloomフィルターインデックスを定義することで、どのように「藁の中から針を探す」クエリーをスピードアップしているのかをデモンストレーションしています。
Bloom filterデモノートブック