阿里云首页 Databricks数据洞察

Bloom过滤器索引

Bloom filter索引是一种节省空间的数据结构,它允许在选定的列上数据skipping,特别是对于包含任意文本的字段。bloom filter通过声明数据肯定不在文件中,或者它可能在文件中,并使用定义的false positive probability(FPP)进行操作。

说明

详细内容可参考Databricks官网文章:Bloom过滤索引

Databricks支持文件级Bloom过滤器;每个数据文件都可关联一个 Bloom 筛选器索引文件。在读取文件之前,Databricks会检查索引文件,并且仅在索引指示该文件可能与数据筛选器匹配时才会读取该文件。如果索引不存在或未为查询的列定义Bloom过滤器,则Databricks会一直读取数据文件。

Bloom 筛选器的大小由两者决定:为其创建了 Bloom 筛选器的集中的数字元素,以及必需的 FPP。FPP越低,每个元素使用的位数越多,它的准确性就越高,但代价是磁盘空间占用更多、下载速度更慢。例如,FPP为10%时,每个元素需要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。不会向 Bloom 筛选器添加 NULL 值,因此任何与NULL相关的筛选器都需要读取数据文件。Databricks支持以下数据源筛选器:and、or、in、equals和equalsnullsafe。嵌套列不支持Bloom筛选器。

配置

默认情况下启用Bloom过滤器。要禁用Bloom过滤器,请将会话级别spark.databricks.io.skipping.bloomFilter.enabled配置设置为false。

创建Bloom过滤器索引

若要在表格中为新数据或重写数据的所有列或部分列创建 Bloom 筛选器索引,请使用createbloomfilter index DDL语句。例如,以下语句在列 sha 中创建 Bloom 筛选器索引,并在列中将 FPP 0.1 和 50,000,000 作为不同的项。

SQL

CREATE BLOOMFILTER INDEX
ON TABLE bloom_test
FOR COLUMNS(sha OPTIONS (fpp=0.1, numItems=50000000))

删除Bloom过滤器索引

若要从表或表的一组列中删除所有 Bloom 过滤器,请使用DDL语句。例如:DROP BLOOMFILTER INDEX

SQL

DROP BLOOMFILTER INDEX ON TABLE bloom_test FOR COLUMNS(sha);

Notebook

以下Notebook演示了如何定义Bloom过滤器索引来加速“needle in a haystack”查询。

Bloom筛选器演示Notebook

Notebook链接地址:Bloom filter index demo