Bloom 筛选器索引

Bloom 筛选器索引是一种空间高效的数据结构,可用于跳过所选列上的数据。 对于具有许多非重复值的列(如自由格式文本或 ID)尤其有效。

Bloom 筛选器索引的限制

Important

Azure Databricks 不建议对大多数工作负荷使用 Bloom 筛选器索引。

尽管 Bloom 筛选器索引支持跳过具有唯一值的基数较高的列的数据,但它们通常会引入如下问题:

  • 它们仅在创建索引后写入的索引文件。 索引不适用于现有文件。
  • 它们很难优化,并且通常会增加开销,而不会带来显著的性能优势。
  • 它们最适合单个列上的高度选择性相等筛选器。 它们对更广泛的筛选器几乎没有好处。
  • Bloom 筛选器索引仅适用于显式定义的列。 如果查询开始筛选不与 Bloom 筛选器索引列重叠的列,则必须手动删除并重新创建索引,从而增加作开销。 还需要使用新数据从头开始重新生成新索引。

虽然 Bloom 筛选器索引旨在跳过文件读取,但 Azure Databricks 仍必须扫描每个数据文件的索引文件。 Z 排序和液体聚类分析更有效,因为它们允许引擎避免考虑大多数文件。

Azure Databricks 建议使用以下功能,而不是 Bloom 筛选器索引:

  • 预测 I/O - 使用 Databricks Runtime 12.2 及更高版本启用 Photon 的计算时,预测 I/O 使用高级启发法对所有列执行文件跳过。 它完全将 Bloom 筛选器索引子化,仅当启用了 Photon 时,该索引只会增加写入开销。
  • 液体聚类分析 在 Databricks Runtime 13.3 及更高版本中,液体聚类分析通过基于经常筛选的列组织数据来改进跳过的数据。 它的工作方式比 Bloom 筛选器索引更精细,并允许 Azure Databricks 在查询规划期间跳过整个文件组。

Important

避免将 Bloom 筛选器索引与预测 I/O 组合在一起。 启用两者后,Bloom 筛选器索引优先并禁用预测 I/O,从而提供更快、更可靠的性能。

Bloom 筛选器索引的工作原理

Azure Databricks Bloom 筛选器索引由每个数据文件的数据跳过索引组成。 Bloom 筛选器索引可用于确定列值是否确实不在文件中,或者有可能在文件中。 在读取文件 Azure Databricks 之前,将检查索引文件,并且仅当索引指示该文件可能与数据筛选器匹配时,该文件才会读取。

Bloom 筛选器索引支持具有以下输入数据类型的列:byte、、intshortfloatlongdoubledatetimestampstring。 Null 不会添加到 Bloom 筛选器索引,因此任何与 null 相关的筛选器都需要读取数据文件。 Azure Databricks 支持以下数据源筛选器:andorinequalsequalsnullsafe。 嵌套列不支持 Bloom 筛选器索引。

配置和参考

使用以下语法启用 Bloom 筛选器:

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

有关语法详细信息,请参阅 CREATE BLOOM FILTER INDEXDROP BLOOM FILTER INDEX

若要禁用 Bloom 筛选器操作,请将会话级别 spark.databricks.io.skipping.bloomFilter.enabled 配置设置为 false

显示 Bloom 筛选器索引的列表

若要显示索引列表,请运行:

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

For example:

Show indexes