Hive建表(三)侧视图(Lateral View)

视图概述
1.通过隐藏子查询、连接和函数来简化查询的逻辑结构
2.产生虚拟表,从真实表中选取数据
3.只保存定义,不存储数据
4.如果删除或更改基础表,则查询视图将失败
5.视图是只读的,不能插入或装载数据
应用场景
1.将特定的列提供给用户,保护数据隐私
2.查询语句复杂的场景

侧视图与用户定义的表生成函数(如explode())关联使用。如表生成函数所述,UDTF为每个输入行生成零个或多个输入行。侧视图首先将UDTF应用于基表的每一行,然后将它们的结果输出行连接到输入行,以形成拥有提供表别名的虚拟表。
视图操作命令
创建视图
CREATE VIEW view_name AS SELECT statement;
– 创建视图支持 CTE, ORDER BY, LIMIT, JOIN, etc.
查找视图 (SHOW VIEWS 在 hive v2.2.0之后)
SHOW TABLES;
查看视图定义
SHOW CREATE TABLE view_name;
删除视图
DROP view_name;
更改视图属性
ALTER VIEW view_name SET TBLPROPERTIES (‘comment’ = ‘This is a view’);
更改视图定义
ALTER VIEW view_name AS SELECT statement;

explode(列名):
Hive内置的表生成函数,主要用于把一行输入拆成多行。
explode(ARRAY < T> a)
将一个数组展开为多行。返回一个带有单列(col)的行集,数组中每个元素都有一行
explode(MAP<Tkey,Tvalue> m)
将一个映射展开为多行。返回一个带有两列(键,值)的行集,从输入映射中为每个键值对返回一行。(从Hive0.8.0起)
explode(split(word,’ \ \|’))
将某一列名为word展开为多行,返回分割“|”后所有的值,分割后的所有值每一个都返回一行
stack(int r,T1 V1,…,Tn/r Vn)
将n个值V1,…,Vn分解为r行。每行将有n/r列,r必须是常数。
示例
一张表有两列:name string,likes string
值有三组:name: zhangsan lisi wangwu
likes :football|basketball;film|food;song|dance

单侧视图查询结果
每个人都有2个爱好likes,多行分别显示每个人每个likes的结果

或者
select like from mytest lateral view explode(split(likes,’\ \|’)) a as like;
因为likes列中的数据中间有特殊字符,所以需要分割转义后的特殊字符,给新的侧视图娶个别名
Multiple Lateral Views(多侧视图):
LATERAL VIEW explode(id1) mytest1 AS myts1
LATERAL VIEW explode(str2) mymytest2 AS myts2;
示例
有一张基表有两个列:Array id1,Array str2。
有两个示例字段:id1 [1, 2] , [3, 4]
str2 [“a”, “b”, “c”], [“d”, “e”, “f”]
①执行Hive 语句: 单侧视图
SELECT id1, mystr22 FROM mytest2
LATERAL VIEW explode(str2) a AS mystr2;
由于是单侧视图查询str2的所有数组值, 所以会到侧视图左侧找所有匹配的列中所有值,直到全部匹配完
多侧视图查询结果
SELECT myid1, mystr2 FROM mytest2
LATERAL VIEW explode(id1) b AS myid1;
LATERAL VIEW explode(str2) a AS mystr2;
这时不仅会匹配数组中str2中的所有的值,还会匹配数组id1中所有的值

Outer Lateral Views(外侧视图):
OUTER关键字:即使侧视图的列没有值,output为空也会打印生成结果为null
select id,buy_id,last from test
lateral view outer explode(buy_id) a as last;
当一个侧视图通常不会生成一行时,所得到的结果是空值;在这种情况下,源行不会出现在结果中。可以使用Outer来使得在UDTF的列中将空的部分使用NULL值来生成行。

Union和Union all:
(1)Union:对两个结果集进行并集操作,去除重复行,同时进行默认规则的排序。
(2)Union all:对两个结果集进行并集操作,不去除重复行,不进行排序。

猜你喜欢

转载自blog.csdn.net/zp17834994071/article/details/106701442