重要
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。
- 对表进行索引后,除非显式地刷新索引,否则不能保证后续
INSERT或ADD PARTITION操作的影响会被看见。
SQL 语法
创建索引
CREATE DATASKIPPING INDEX ON [TABLE] [db_name.]table_name
为第一个(即最左)的 N 个支持的列启用给定表上的数据跳过,其中 N 受 spark.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
禁用给定表上的数据跳过功能并删除所有索引数据。