目录
一、什么是索引
二、原理
三、详细内容
四、完整流程示例
1.创建索引语法
2.生成索引
3.查看索引
4.更新索引属性
5.删除索引
一、什么是索引
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
官网索引介绍地址:
LanguageManual Indexing - Apache Hive - Apache Software Foundation
二、原理
Hive可以在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量;在执行索引字段查询时候,首先额外生成一个MapReduce job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的hdfs文件路径及偏移量,输出到hdfs上的一个文件中,然后根据这些文件中的 hdfs路径和偏移量,筛选原始input文件,生成新的split,作为整个job的split,达到不用全表扫描的目的。 不过从Hive3.0开始,Hive已经移除了索引。
移除索引后的替代方案:
1.可以自动重写的物化视图 2.使用列式文件格式(Parquet、ORC)ps:可以进行选择性扫描;甚至可以跳过整个文件/块。
三、详细内容
代码语言:javascript复制创建、查看与删除索引
Create/build, show, and drop index:
CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;
先创建在构建、查看与删除索引
Create then build, show formatted (with column names), and drop index:
CREATE INDEX table02_index ON TABLE table02 (column3) AS 'COMPACT' WITH DEFERRED REBUILD;
ALTER INDEX table02_index ON table2 REBUILD;
SHOW FORMATTED INDEX ON table02;
DROP INDEX table02_index ON table02;
创建位图(bitmap)索引、查看与删除
Create bitmap index, build, show, and drop:
CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD;
ALTER INDEX table03_index ON table03 REBUILD;
SHOW FORMATTED INDEX ON table03;
DROP INDEX table03_index ON table03;
在一张新表上创建索引
Create index in a new table:
CREATE INDEX table04_index ON TABLE table04 (column5) AS 'COMPACT' WITH DEFERRED REBUILD IN TABLE table04_index_table;
创建RCFile格式的索引
Create index stored as RCFile:
CREATE INDEX table05_index ON TABLE table05 (column6) AS 'COMPACT' STORED AS RCFILE;
创建TEXTFILE格式的索引
Create index stored as text file:
CREATE INDEX table06_index ON TABLE table06 (column7) AS 'COMPACT' ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' STORED AS TEXTFILE;
创建带有索引属性的索引
Create index with index properties:
CREATE INDEX table07_index ON TABLE table07 (column8) AS 'COMPACT' IDXPROPERTIES ("prop1"="value1", "prop2"="value2");
创建带有表属性的索引
Create index with table properties:
CREATE INDEX table08_index ON TABLE table08 (column9) AS 'COMPACT' TBLPROPERTIES ("prop3"="value3", "prop4"="value4");
删除索引
Drop index if exists:
DROP INDEX IF EXISTS table09_index ON table09;
在分区上重建索引
Rebuild index on a partition:
ALTER INDEX table10_index ON table10 PARTITION (columnX='valueQ', columnY='valueR') REBUILD;
四、完整流程示例
1.创建索引语法
代码语言:javascript复制-- 创建创建索引
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"]
;
--详情说明
指定索引处理器 AS ‘index.handler.class.name’
一般使用org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler处理器
表明创建一个空索引 [WITH DEFERRED REBUILD]
索引的参数 [IDXPROPERTIES (property_name=property_value, …)]
索引存储在哪个表 [IN TABLE index_table_name]
指定分区创建索引,不指定默认所有分区都创建索引
[PARTITIONED BY (col_name, …)]
[
[ ROW FORMAT …] STORED AS …
| STORED BY …
]
2.生成索引
代码语言:javascript复制alter index 索引名称 on 表名 rebuild;
3.查看索引
代码语言:javascript复制SHOW FORMATTED INDEX ON table_name;
4.更新索引属性
代码语言:javascript复制ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;
5.删除索引
代码语言:javascript复制DROP INDEX [IF EXISTS] index_name ON table_name;