1.使用视图降低查询复杂度
使用视图主要是为了将查询语句分隔为多个小的,更可控的片段,降低复杂度。
下面是一个嵌套子查询的查询:
FROM (
SELECT * FROM people JOIN cart
ON (cart.people_id = people.id) WHERE firstname = 'John'
) a SELECT a.lastname WHERE a.id = 3;
将嵌套的子查询变成一个视图:
CREATE VIEW shorter_join AS
SELECT * FROM people JOIN cart
ON (cart.people_id = people.id) WHERE firstname = 'John';
这样一来,之前的查询语句就成了:
SELECT lastname FROM shorter_join WHERE id = 3;
2.限制查询结果
通过创建视图来限制访问数据用来保护信息不被随意访问:
CREATE TABLE userinfo (
firstname string,
lastname string,
ssn string,
password string);
CREATE VIEW techops_employees AS
SELECT firstname, lastname, ssn FROM userinfo
WHERE department = 'techops';
上述在视图只能查询前三个字段,限制了第四个字段密码的访问。
3.对map类型的视图
创建表:
CREATE EXTERNAL TABLE dynamictable(
cols map<string, string>)
ROW FORMAT DELIMITED
FILEDS TERMINATED BY '\004'
COLLECTION ITEMS TERMINATED BY '\001'
MAP KEYS TERMINATED BY '\002'
STORED AS TEXTFILE;
创建视图:
CREATE VIEW shipments(time, part) AS
SELECT cols["time"], cols["parts"]
FROM dynamictable
WHERE cols["type"] = 'response';
定义一个视图并不会 具体化 操作任何实际数据,视图实际上是对其所使用的表和列的一个查询语句固化的过程。因此,如果视图所涉及到的表或者列不再存在时,会导致视图查询失败。
索引
建立索引可以帮助裁剪掉一张表的一些数据块,这样能减少MR的输入数据量,并非所有的查询都可以通过建立索引获得好处。
通过EXPLAIN命令可以查看某个查询语句是否用到索引。
hive中的索引维护也需要额外的存储空间,创建也需要消耗计算资源,需要在建立索引为查询带来的好处和需要付出的代价之间做出权衡。
我们对之前创建的employees表建立索引:
CREATE INDEX employees_index
ON TABLE employees (country)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD
IDXPROPERTIES ('creator' = 'me')
IN TABLE employees_index_table
PARTITIONED BY (country, name)
COMMENT '';
其中AS语句指定了索引处理器,一个实现索引接口的Java类,IN TABLE 表示索引将在一张新表中保留索引数据,指定DEFERRED REBUILD,新索引将呈现空白状态,在任何时候都可以进行第一次索引创建或者使用ALTER INDEX对索引进行重建:
ALTER INDEX employees_index
ON TABLE employees PARTITION (country = 'US')
REBUILD;
显示索引
SHOW INDEX ON employees;
删除索引
DROP INDEX IF EXISTS employees_index ON TABLE employees;
© 著作权归作者所有
发表评论