【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[24]篇文章,欢迎阅读和收藏】
1基本概念
Hive支持索引,但是 Hive 的索引与关系型数据库中的索引并不相同,比如, Hive 不支持主键或者外键。Hive 索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少 MapReduce 任务中需要读取的数据块的数量。在可以预见到分区数据非常庞大的情况下,索引常常是优于分区的。需要时刻记住的是, Hive 并不像事物数据库那样针对个别的行来执行查询、更新、删除等操作。这些操作依赖高效的索引来实现高性能。
Hive是一种批处理工具,通常用在多任务节点的场景下,快速地扫描大规模数据。关系型数据库则适用于典型的单机运行、 I/O 密集型的场景。Hive 通过并行化来实现性能,因此 Hive 更适用于全表扫描这样的操作,而不是像使用关系型数据库一样操作。
2术语解释
索引机制:在指定列上建立索引,会产生一张索引表( Hive 的一张物理表),里面的字段包括,索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量 ; 在执行索引字段查询时候,首先额外生成一个 MR job ,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的 hdfs 文件路径及偏移量,输出到 hdfs 上的一个文件中,然后根据这些文件中的 hdfs 路径和偏移量,筛选原始 input 文件,生成新的 split, 作为整个 job 的 split, 这样就达到不用全表扫描的目的。
3详细说明
Hive 的索引目的是提高 Hive 表指定列的查询速度。没有索引时,类似 'WHERE tab1.col1 = 10' 的查询, Hive 会加载整张表或分区,然后处理所有的 rows ,但是如果在字段 col1 上面存在索引时,那么只会加载和处理文件的一部分。与其他传统数据库一样,增加索引在提升查询速度时,会消耗额外资源去创建索引和需要更多的磁盘空间存储索引。Hive 0.7.0 版本中,加入了索引。Hive 0.8.0 版本中增加了 bitmap 索引。
如下为创建表和索引案例
步骤一:创建索引测试表
CREATE TABLE index_test(
id INT,
name STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED FILEDS TERMINATED BY ',';
说明:
创建一个索引测试表 index_test , dt 作为分区属性,
“ROW FORMAT DELIMITED FILEDS TERMINATED BY ','” 表示用逗号分割字符串,默认为 ‘\001’ 。
步骤二:创建临时索引表
create table index_tmp(
id INT,
name STRING,
dt STRING
)
ROW FORMAT DELIMITED FILEDS TERMINATED BY ',';
说明:临时索引表是 table index_tmp
步骤三:加载数据到临时索引表中
load data local inpath '/home/hadoop/djt/test.txt' into table index_tmp;
步骤四:设置 Hive 的索引属性来优化索引查询
步骤五:查询临时索引表中的数据,插入到索引测试表中。
insert overwrite table index_test partition(dt) select id,name,dt from index_tmp;
步骤六:使用 索引测试表,在属性 id 上创建一个索引
步骤七:填充索引测试表的索引数据
alter index index1_index_test on index_test rebuild;
步骤八:查看索引测试表的创建的索引
show index on index_test
步骤九:查看索引测试表的分区信息
show partitions index_test;
步骤十:查看索引测试表的索引数据
$ hadoop fs -ls /usr/hive/warehouse/default_index_test_index1_index_test_
步骤十一:删除索引测试表的索引
drop index index1_index_test on index_test;
show index on index_test;
步骤十二:索引测试表的索引数据也被删除
$ hadoop fs -ls /usr/hive/warehouse/default_index_test_index1_index_test_
no such file or directory
领取专属 10元无门槛券
私享最新 技术干货