Hive的视图其实是一个虚表,视图可以允许保存一个查询,并像对待表一样对这个查询进行操作,视图是一个逻辑结构,并不会存储数据。
Hive中的索引只有有限的功能,Hive中没有主键和外键的概念,可以通过对一些字段建立索引来加速某些操作。Hive对外部表和视图都是可以建立索引的。若有索引表,删除一个索引将会删除这个索引表。若被索引的表被删除了,那么对应的索引和索引表也会被删除;若原始表的某个分区被删除了,那么这个分区对应的分区索引同时会被删除掉。
下面是Hive视图与索引的概念和使用,enjoy~~
一、视图
1,含义
视图是一个虚拟表,其内容由查询定义。Hive 中的视图和RDBMS中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条SELECT语句的结果集。视图是纯粹的逻辑对象,没有关联的存储(Hive 3.0.0引入的物化视图除外),当查询引用视图时,Hive可以将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。
2,特点
(1)不支持物化视图 ;
(2)只能查询,不能做加载数据操作 ;
(3)视图的创建,只是保存一份元数据,查询视图时才执行对应的子查询 ;
(4)view定义中若包含了ORDER BY/LIMIT语句,当查询视图时也进行了ORDER BY/LIMIT语句操作,view当中定义的优先级更高 ;
(5)Hive视图支持迭代视图。
3,意义
(1) 使用视图使数据操作更简便,相当于封装了sql语句,类似于关系型数据库中的存储过程。
(2) 使用视图,基表中的数据有了一定的安全性,使用视图可以基于限制条件过滤数据,通过视图限制数据访问可以保护信息不被随意查询。
4,视图的操作
(1)新建视图
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name
[(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT ... ;
(2)查询视图
select colums from view;
(3)删除视图
DROP VIEW [IF EXISTS] [db_name.]view_name;
5,视图的查看
(1) show tables;可以查看到新增的视图。
(2) Hive的元数据信息一般存储在mysql,Hive的视图信息存储在mysql hive数据库中的 TBLS 表中,通过如下查询语句可以查询得到Hive中的所有视图:
SELECT * FROM TBLS WHERE TBL_TYPE='VIRTUAL_VIEW';
6,视图的使用
(1)通过定义视图可以将频繁使用的SELECT语句保存以提高效率。
(2)通过定义视图可以使用户看到的数据更加清晰。
(3)通过定义视图可以不对外公开数据表全部字段,增强数据的保密性。
(4)通过定义视图可以降低数据的冗余。
二、索引
1,含义
Hive的索引可以提高数据的检索效率,避免全表扫描和资源浪费,对于含有group by的语句,对group by的字段添加索引可以提高查询速度。
2,实现原理
在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量。
在执行索引字段查询时候,首先额外生成一个MR job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的hdfs文件路径及偏移量,输出到hdfs上的一个文件中,然后根据这些文件中的hdfs路径和偏移量,筛选原始input文件,生成新的split,作为整个job的split,这样就达到不用全表扫描的目的。
3,索引的创建
创建索引的字段最好使用不更新的字段,以免频繁重建索引数据。每次建立、更新数据后,都要重建索引以构建索引表。
例子:现在有一张表名为product1的表,需要将该表中的sku字段建立一个索引
create index test_index on table product1(sku)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild
in table product1_index;
create index test_index2 on table product1(sku) as 'bitmap' with deferred rebuild in table product1_index2;
//创建索引
create index test_index2 on table product1(sku) as 'bitmap' with deferred rebuild in table product1_index2;
show tables;
+------------------+--+
| tab_name |
+------------------+--+
| gal_view | //这是之前创建的视图
| logistic |
| product1 |
| product1_index2 | //可以看到这里多了一张索引表
| stocks |
+------------------+--+
5 rows selected (0.033 seconds)
//重建索引生成索引数据(建立索引之后必须重建索引才能生效)
alter index test_index2 on product1 rebuild;
//创建完成后通过索引命令显示索引
SHOW FORMATTED INDEX ON product1;
+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+--+
| idx_name | tab_name | col_names | idx_tab_name | idx_type | comment |
+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+--+
| idx_name | tab_name | col_names | idx_tab_name | idx_type | comment |
| | NULL | NULL | NULL | NULL | NULL |
| | NULL | NULL | NULL | NULL | NULL |
| test_index2 | product1 | sku | product1_index2 | bitmap | |
+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+--+
4,索引的删除
DROP INDEX IF EXISTS product1_index2 ON product1;
5,索引的使用
ive默认不使用索引,需要设置才能使索引生效:
SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
SET hive.optimize.index.filter=true;
SET hive.optimize.index.filter.compact.minsize=0;
//执行查询
select * from product1 where sku=272480720;
以上的内容来源网络,仅供学习交流,如有侵犯,联系删除哦!