共用方式為

“数据跳过”索引

重要

DATASKIPPING INDEX 在 Databricks Runtime 7.0 中删除。 建议改用 Delta 表,它提供了经过改进的数据跳过功能

重要

本文档已停用,可能不会更新。 本内容中提及的产品、服务或技术不再受支持。 请参阅 Delta Lake 的数据跳过

Description

除了分区修剪之外,Databricks Runtime 还包含另一项功能,旨在避免扫描不相关的数据,即数据跳过索引。 它使用文件级统计信息以在文件粒度上执行额外跳过。 这支持 Hive 样式分区,但不依赖于该分区方式。

跳过数据的有效性取决于数据的特征及其物理布局。 由于跳过操作是在文件级别进行的,因此数据需跨多个文件进行水平分区,这一点十分重要。 这通常是由于有多个追加作业、(随机)分区、存储桶和/或使用 spark.sql.files.maxRecordsPerFile。 它最适合用于带有已排序存储桶(df.write.bucketBy(...).sortBy(...).saveAsTable(...) / CREATE TABLE ... CLUSTERED BY ... SORTED BY ...)的表,或者与分区键相关的列(例如,brandName - modelNamecompanyID - stockPrice),但即使数据恰好展现某种排序/聚集特性时(例如,orderIDbitcoinValue),也能得心应手。

注释

此 beta 版功能具有许多重要 限制

  • 它是“选择加入”:需要按表手动启用。
  • 仅支持 SQL:不提供 DataFrame 的 API。
  • 对表进行索引后,除非显式地刷新索引,否则不能保证后续INSERTADD PARTITION操作的影响会被看见。

SQL 语法

创建索引

CREATE DATASKIPPING INDEX ON [TABLE] [db_name.]table_name

为第一个(即最左)的 N 个支持的列启用给定表上的数据跳过,其中 Nspark.databricks.io.skipping.defaultNumIndexedCols 控制(默认值:32)

partitionBy 列始终被索引,并且不计入此 N

为列创建索引

CREATE DATASKIPPING INDEX ON [TABLE] [db_name.]table_name
    FOR COLUMNS (col1, ...)

为指定的列列表启用表格的数据跳过功能。 与上述相同,除指定列之外,所有 partitionBy 列都将始终被索引。

描述索引

DESCRIBE DATASKIPPING INDEX [EXTENDED] ON [TABLE] [db_name.]table_name

显示给定表的哪些列已编制索引,以及收集的相应类型的文件级统计信息。

如果指定了 EXTENDED,将显示一个名为“effectiveness_score”的第三列,该列提供了一个我们预期 DataSkipping 对相应列的筛选器有多大益处的近似衡量。

刷新完整索引

REFRESH DATASKIPPING INDEX ON [TABLE] [db_name.]table_name

重新生成整个索引。 也就是说,将为表的所有分区重新编制索引。

刷新分区

REFRESH DATASKIPPING INDEX ON [TABLE] [db_name.]table_name
    PARTITION (part_col_name1[=val1], part_col_name2[=val2], ...)

仅对指定的分区重新编制索引。 此操作一般来说应比完整索引刷新更快。

删除索引

DROP DATASKIPPING INDEX ON [TABLE] [db_name.]table_name

禁用给定表上的数据跳过功能并删除所有索引数据。