基于物化视图优化_从零开始学习大数据系列(六十八) Hive的视图和索引

[本文1800字左右,预计阅读需要10-15分钟]

在Hive中也是支持视图和索引的,但与关系型数据库中的又有所区别。让我们分别来了解下Hive中的视图与索引。

Hive中的视图

Hive 中的视图和RDBMS中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条SELECT语句的结果集。视图是纯粹的逻辑对象,没有关联的存储(Hive 3.0.0引入的物化视图除外),当查询引用视图时,Hive可以将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。

Hive的视图语法

创建视图:
CREATEVIEW [IF NOT EXISTS] [db_name.]view_name  [(column_name [COMMENT column_comment], ...)]  [COMMENT view_comment]  [TBLPROPERTIES (property_name =property_value, ...)]AS SELECT ... ;
注意事项:在 Hive 中可以使用 CREATEVIEW 创建视图,如果已存在具有相同名称的表或视图,则会抛出异常,建议使用 IF NOT EXISTS 预做判断。在使用视图时候需要注意以下事项:
  • 视图是只读的,不能用作 LOAD、 INSERT、ALTER 的目标; 

  • 在创建视图时候视图就已经固定,对基表的后续更改(如添加列)将不会反映在视图;

  • 删除基表并不会删除视图,需要手动删除视图;

  • 视图可能包含 ORDER BY 和LIMIT 子句。如果引用视图的查询语句也包含这类子句,其执行优先级低于视图对应字句。例如,视图custom_view 指定 LIMIT 5,查询语句为select * from custom_view LIMIT 10,此时结果最多返回 5 行。

  • 创建视图时,如果未提供列名,则将从 SELECT 语句中自动派生列名;

查看视图:

       没有单独查看视图列表的语句,只能使用 show tables。

show tables;
查看某个视图:
desc view_name;

9ef0ac0c4af835e31b1cb105587e711f.png

查看某个视图详细信息:
desc formatted view_name;

66f47bec20104656dc68ab5c9bd13195.png

删除视图:
DROP VIEW [IF EXISTS] [db_name.]view_name;
删除视图时,如果被删除的视图被其他视图所引用,这时候程序不会发出警告,但是引用该视图其他视图已经失效,需要进行重建或者删除。修改视图:
ALTER VIEW [db_name.]view_name ASselect_statement;
被更改的视图必须存在,且视图不能具有分区,如果视图具有分区,则修改失败。

Hive视图的应用场景

  • 数据仓库中维度角色扮演和维度子维度时可以采用视图的方式保证维度的一致性;

  • 当Hive中的查询变得很长或复杂时,通过视图将这个查询语句分割成多个小的、更可控的片段可以降低这种复杂度;

  • Hive中需要通过视图限制基于条件过滤的数据时;

Hive中的索引

Hive 在 0.7.0 引入了索引的功能,索引的设计目标是提高表某些列的查询速度。Hive只是提供有限的索引功能,当建表时逻辑分区太多无法建立时,建立索引也就成为分区的另一个选择,建立索引可以帮助裁剪掉表一些数据,这样能减少MapReduce的输入数据量。Hive中没有普通关系数据库中的键的概念,但是还是可以对一些字段建立索引来加速某些操作。在指定列上建立索引,会产生一张索引表,里面的字段包括:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。在查询涉及到索引字段时,首先到索引表查找索引列值对应的 HDFS 文件路径及偏移量,这样就避免了全表扫描,但是并非所有的查询都可以通过建立索引获得好处,使用EXPLAIN命令可以查看某个查询语句是否用到了索引。Hive中的索引和关系数据库中的一样,需要进行仔细评估才能使用,维护索引也需要额外的空间,同时创建索引也需要耗费计算资源。    

Hive的索引语法

创建索引:
CREATE INDEX index_name     --索引名称  ON TABLE base_table_name (col_name, ...)  --建立索引的列  AS index_type    --索引类型  [WITH DEFERRED REBUILD]    --重建索引  [IDXPROPERTIES (property_name=property_value, ...)]  --索引额外属性  [IN TABLE index_table_name]    --索引表的名字  [     [ ROW FORMAT ...] STORED AS ...       | STORED BY ...  ]   --索引表行分隔符 、 存储格式  [LOCATION hdfs_path]  --索引表存储位置  [TBLPROPERTIES (...)]   --索引表表属性  [COMMENT "index comment"];  --索引注释
查看索引:显示表上所有列的索引。
SHOW FORMATTED INDEX ON table_name;
此时索引表中是没有数据的,需要重建索引才会有索引的数据。

566baa67eee613dbd192c01b9fb8f296.png

重建索引:
ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;
如果指定了 PARTITION,则仅重建该分区的索引。

80d4df4c2fa20d2cb1289ce97f816153.png

重建索引时Hive 会启动 MapReduce 作业去建立索引,建立好后查看索引表数据如下。三个表字段分别代表:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。

b31ff24143ef926507d67a49e8366697.png

删除索引:删除索引会删除对应的索引表。
DROP INDEX [IF EXISTS] index_name ON table_name;
如果存在索引的表被删除了,其对应的索引和索引表都会被删除。如果被索引表的某个分区被删除了,那么分区对应的分区索引也会被删除。

自动使用索引:

默认情况下,虽然建立了索引,但是 Hive 在查询时候是不会自动去使用索引的,需要开启相关配置。开启配置后,涉及到索引列的查询就会使用索引功能去优化查询。
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;

Hive索引的优缺点

优点:
  • 可以避免全表扫描和资源浪费。

  • 可以加快含有group by的语句的查询速度。

    缺点:

  • 使用过程繁琐

  • 需要额外的Job去扫描表,时间较长

  • 索引表无法自动 rebuild,这也就意味着如果表中有数据新增或删除,则必须手动 rebuild,重新执行 MapReduce 作业,生成索引表数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值