教材第六章 Hive 数据库对象与用户自定义函数 实验
一 Hive 视图
hive视图只是一个逻辑概念,创建视图时定义的select 语句是一种逻辑规则,在视图定义时不会立即执行;只有当对视图执行select查询时,才会真正执行视图中定义的select语句逻辑规则来获取数据。
1创建视图
视图的一个简单例子:以emp表为例
hive> create view emp_view as select ename, job, sal from emp where deptno = 20;
hive> desc emp_view;
OK
ename varchar(30)
job varchar(50)
sal double
hive> desc formatted emp_view;
说明:定义一个视图emp_view,其逻辑规则是展示emp表的deptno列值等于20的ename, job, sal三列数据;视图能够隐藏真实数据表emp的表结构信息和其他无关列的值,只把允许用户查看的员工姓名、岗位、薪资信息展示给用户,而不允许用户查看员工所属的部门、上司是谁、员工的编号,视图能够起到对原始数据表的信息保护作用,只把允许查看的必要数据展示给有访问权限的上层应用程序或用户
hive> select * from emp_view;
OK
tomiy saleman 8000.0
smith clerk 8000.0
zhang saleman 8000.0
说明:对emp_view进行查询,只能看到ename, job, sal三列的数据,甚至用户都不一定知道emp_view其是一个视图,而不是一张真实的表!另外通过对视图进行SQL查询,可以简化SQL语句。
视图的一个较复杂例子:以sogou表为例
hive> create view sogou_view_limit_1000 as select * from sogou_table_ext where keyword is not null and keyword != '' limit 1000;
OK
Time taken: 0.0712 seconds
说明:创建一个视图sogou_view_limit_1000,其数据源自数据表sogou_table_ext的前1000行数据
hive> select * from sogou_table_ext where keyword is not null and keyword != '' limit 1000;
Time taken: 1.5 seconds
说明:创建视图比执行视图中定义的SQL语句速度更快,说明创建视图的数据并未执行SQL语句,而只是定义了视图的逻辑规则;注意本条select查询带limit 1000语句,未启动MapReduce任务
hive> desc sogou_view_limit_1000;
OK
ts string
uid string
keyword string
rank int
seq int
url string
year int
month int
day int
hour int;
说明:视图的列属性和源自的数据表没有任何区别
hive> desc formatted sogou_view_limit_1000;
hive> select * from sogou_view_limit_1000;
Time taken: 25.824 seconds, Fetched: 1000 row(s)
说明:查询sogou_view_limit_1000视图中的数据,需要执行一个MapReduce任务,原因是该视图中定义的SQL语句逻辑规则中包含limit语句;即使直接执行视图定义中的select * from sogou_table_ext where keyword is not null and keyword != '' limit 1000;语句并不会调用MapReduce任务,但是对sogou_view_limit_1000视图进行SQL查询却会调用MapReduce任务。对逻辑规则中包含limit语句的视图进行select查询,会调用MapReduce任务。
再定义一个逻辑规则中不包含limit语句的视图:
hive> create view sogou_view as select * from sogou_table_ext where keyword is not null and keyword != '';
hive> select * from sogou_view; 对逻辑规则中不包含limit语句的视图执行select查询,不会调用MapReduce任务!
2 视图应用
hive> create view sogou_rank_3_view as select * from sogou_table_ext_partition where rank <=3;
OK
hive> desc view sogou_rank_3_view ;
OK
ts string
uid string
keyword string
rank int
seq int
url string