欢迎投稿

今日深度:

hive的索引,索引的作用相当于图书

hive的索引,索引的作用相当于图书


索引

关系型数据库中的索引:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。一般是建立在建上的。

hive中的索引功能是有限的,hive中没有关系数据库中的建的概念,但是还是可以对某一些字段建立索引。

Hive索引的目标是提高对表的某些列进行查询查找的速度。如果没有索引,则使用类似于“WHERE tab1.col1 = 10”这样的谓词进行查询’加载整个表或分区并处理所有行。但是如果col1存在索引,那么只需要加载和处理文件的一部分。

Hive索引原理:
1) 在指定列上建立索引,生成一张索引表(Hive的一张物理表),记录以下三个字段:索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量
2 ) 在执行索引字段查询时候,首先额外生成一个MapReduce job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的hdfs文件路径及偏移量,输出到hdfs上的一个文件中,然后根据这些文件中的 hdfs路径和偏移量,筛选原始input文件,生成新的split,作为整个job的split,达到不用全表扫描的目的。

1.创建索引语法

-- 创建创建索引
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] 表明创建一个空索引,也就是说现在还不创建索引

[IN TABLE index_table_name] 索引存储在哪个表中。

[IDXPROPERTIES (property_name=property_value, …)] 索引的参数。一般使用IDXPROPERTIES (‘creator’ = ‘me’,‘created_at’ = ‘some_time’),代表创建者和创建时间。

[PARTITIONED BY (col_name, …)]
[
[ ROW FORMAT …] STORED AS …
| STORED BY …
]

表明只对某个分区创建索引,若没有该选项则表示对所有分区都创建索引,另外要注意的是index的分区索引默认是和表的分区一致的,也不能对视图VIEW创建索引。

对product表,根据id创建索引

CREATE INDEX index_hive_4_product_id
ON TABLE hive_4_product (product_id)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD
IDXPROPERTIES ('creator' = 'me','created_at' = 'some_time')
IN TABLE index_hive_4_product_id_table
COMMENT 'index_product_4';

创建好索引后会生成一个存放索引的表。

但是里面是空的

2.生成索引

刚创建完的Hive索引表是没有数据的,需要生成索引数据

alter index 索引名称 on 表名 rebuild;

让index_hive_4_product_idsu索引生效。

alter index index_hive_4_product_id on hive_4_product rebuild;

此时的index_hive_4_product_id_table表中就有了数据

查看数据

发现,索引就是把我们的数据按照ID切分成不同文件存放。值分别代表着【索引列的值】【对应的hdfs文件路径】及【偏移量】。

这里也说明索引不能乱用。现在生成的文件比原文件的数据还大。

3.查看索引

查看某个表上的所有的索引

SHOW FORMATTED INDEX ON table_name;
SHOW FORMATTED INDEXES ON table_name;

查看product表的索引

SHOW FORMATTED INDEX ON hive_4_product;
SHOW FORMATTED INDEXes ON hive_4_product;

idx_type: 指定索引的处理器或者索引类型,实现了索引接口的Java 类,Hive本身包含一些典型的索引实现,比如Compact索引以及Bitmap索引,我们使用的处理器org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler,所以他的类型就是Compact。

hive在 0.8.0版本以后支持了bitmap位图索引

如果用户查询的列的基数非常的小, 即只有的几个固定值,如性别、婚姻状况、行政区等等。要为这些基数值比较小的列建索引,就需要建立位图索引。

对于性别这个列,位图索引形成两个向量,男向量为10100…,向量的每一位表示该行是否是男,如果是则位1,否为0,同理,女向量位01011。

RowId12345
10100
01011

对于婚姻状况这一列,位图索引生成三个向量,已婚为11000…,未婚为00100…,离婚为00010…。

RowId12345
已婚11000
未婚00101
离婚00010

当我们使用查询语句“select * from table where Gender=‘男’ and Marital=“未婚”;”的时候 首先取出男向量10100…,然后取出未婚向量00100…,将两个向量做and操作,这时生成新向量00100…,可以发现第三位为1,表示该表的第三行数据就是我们需要查询的结果。

对product的type创建索引

CREATE INDEX index_hive_4_product_type
ON TABLE hive_4_product (product_type)
AS 'bitmap'
WITH DEFERRED REBUILD
IDXPROPERTIES ('creator' = 'me','created_at' = 'some_time')
IN TABLE index_hive_4_product_type_table
COMMENT 'index_product_4';

4.更改索引属性

-- 更改索引属性
ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

5.删除索引

-- 删除索引
DROP INDEX [IF EXISTS] index_name ON table_name;

删除index_hive_4_product_type索引

DROP INDEX index_hive_4_product_type ON hive_4_product;

www.htsjk.Com true http://www.htsjk.com/hive/45983.html NewsArticle hive的索引,索引的作用相当于图书 索引 关系型数据库中的索引在关系数据库中索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构它是某个表中一列或若...
评论暂时关闭