Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0.0 引入的物化视图除外),当查询引用视图时,Hive 能够将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。git
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name -- 视图名称 [(column_name [COMMENT column_comment], ...) ] --列名 [COMMENT view_comment] --视图注释 [TBLPROPERTIES (property_name = property_value, ...)] --额外信息 AS SELECT ...;
在 Hive 中可使用 CREATE VIEW
建立视图,若是已存在具备相同名称的表或视图,则会抛出异常,建议使用 IF NOT EXISTS
预作判断。在使用视图时候须要注意如下事项:github
视图是只读的,不能用做 LOAD / INSERT / ALTER 的目标;sql
在建立视图时候视图就已经固定,对基表的后续更改(如添加列)将不会反映在视图;apache
删除基表并不会删除视图,须要手动删除视图;性能优化
视图可能包含 ORDER BY 和 LIMIT 子句。若是引用视图的查询语句也包含这类子句,其执行优先级低于视图对应字句。例如,视图 custom_view
指定 LIMIT 5,查询语句为 select * from custom_view LIMIT 10
,此时结果最多返回 5 行。oop
建立视图时,若是未提供列名,则将从 SELECT 语句中自动派生列名;性能
建立视图时,若是 SELECT 语句中包含其余表达式,例如 x + y,则列名称将以_C0,_C1 等形式生成;大数据
CREATE VIEW IF NOT EXISTS custom_view AS SELECT empno, empno+deptno , 1+2 FROM emp;
-- 查看全部视图: 没有单独查看视图列表的语句,只能使用 show tables show tables; -- 查看某个视图 desc view_name; -- 查看某个视图详细信息 desc formatted view_name;
DROP VIEW [IF EXISTS] [db_name.]view_name;
删除视图时,若是被删除的视图被其余视图所引用,这时候程序不会发出警告,可是引用该视图其余视图已经失效,须要进行重建或者删除。优化
ALTER VIEW [db_name.]view_name AS select_statement;
被更改的视图必须存在,且视图不能具备分区,若是视图具备分区,则修改失败。ui
语法:
ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties; table_properties: : (property_name = property_value, property_name = property_value, ...)
示例:
ALTER VIEW custom_view SET TBLPROPERTIES ('create'='heibaiying','date'='2019-05-05');
Hive 在 0.7.0 引入了索引的功能,索引的设计目标是提升表某些列的查询速度。若是没有索引,带有谓词的查询(如'WHERE table1.column = 10')会加载整个表或分区并处理全部行。可是若是 column 存在索引,则只须要加载和处理文件的一部分。
在指定列上创建索引,会产生一张索引表(表结构以下),里面的字段包括:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。在查询涉及到索引字段时,首先到索引表查找索引列值对应的 HDFS 文件路径及偏移量,这样就避免了全表扫描。
+--------------+----------------+----------+--+ | col_name | data_type | comment | +--------------+----------------+----------+--+ | empno | int | 创建索引的列 | | _bucketname | string | HDFS 文件路径 | | _offsets | array<bigint> | 偏移量 | +--------------+----------------+----------+--+
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;
删除索引会删除对应的索引表。
DROP INDEX [IF EXISTS] index_name ON table_name;
若是存在索引的表被删除了,其对应的索引和索引表都会被删除。若是被索引表的某个分区被删除了,那么分区对应的分区索引也会被删除。
ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;
重建索引。若是指定了 PARTITION,则仅重建该分区的索引。
在 emp 表上针对 empno
字段建立名为 emp_index
,索引数据存储在 emp_index_table
索引表中
create index emp_index on table emp(empno) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table emp_index_table ;
此时索引表中是没有数据的,须要重建索引才会有索引的数据。
alter index emp_index on emp rebuild;
Hive 会启动 MapReduce 做业去创建索引,创建好后查看索引表数据以下。三个表字段分别表明:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。
默认状况下,虽然创建了索引,可是 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;
SHOW INDEX ON emp;
索引表最主要的一个缺陷在于:索引表没法自动 rebuild,这也就意味着若是表中有数据新增或删除,则必须手动 rebuild,从新执行 MapReduce 做业,生成索引表数据。
同时按照官方文档 的说明,Hive 会从 3.0 开始移除索引功能,主要基于如下两个缘由:
ORC 内置的索引功能能够参阅这篇文章:Hive 性能优化之 ORC 索引–Row Group Index vs Bloom Filter Index
更多大数据系列文章能够参见 GitHub 开源项目: 大数据入门指南