hive之explode、lateral view函数的使用

2022年03月27日 127点热度 0人点赞 0条评论

LATERAL VIEW

lateral view是Hive中提供给UDTF的结合,它可以解决UDTF不能添加额外的select列的问题。
lateral view其实就是用来和想类似explode这种UDTF函数联用的,lateral view会将UDTF生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行进行join来达到连接UDTF外的select字段的目的。

explode

explode函数:处理map结构的字段,将数组转换成多行

需求:

《疑犯》 悬疑,动作,科幻,爱情
《lie to me》 悬疑,警匪,动作,心理,剧情
《战狼》 战争,动作,灾难

转成如下格式:

《疑犯》 悬疑
《疑犯》 动作
《疑犯》 科幻
《疑犯》 爱情
《lie to me》 悬疑
《lie to me》 警匪
《lie to me》 动作
《lie to me》 心理
《lie to me》 剧情
《战狼》 战争
《战狼》 动作
《战狼》 灾难

数据

create table movie_info(
    movie string,
    category array<string>)
row format delimited 
fields terminated by "\t"
collection items terminated by ","; 

-- 查看数据
select explode(category) from movie_info;

如果想要得到题目的需求结果,那么需要在此结果上,每一部电影和该电影对应的category进行笛卡尔积,得到结果:

格式一
lateral view udtf(expression) tableAlias as columnAlias (,columnAlias)*

lateral view在UDTF前使用,表示连接UDTF所分裂的字段。
UDTF(expression):使用的UDTF函数,例如explode()。
tableAlias:表示UDTF函数转换的虚拟表的名称。
columnAlias:表示虚拟表的虚拟字段名称,如果分裂之后有一个列,则写一个即可;如果分裂之后有多个列,按照列的顺序在括号中声明所有虚拟列名,以逗号隔开。
格式二
from basetable (lateral view)*

在from子句中使用,一般和格式一搭配使用,这个格式只是说明了lateral view的使用位置。
from子句后面也可以跟多个lateral view语句,使用空格间隔就可以了。
格式三
from basetable (lateral view outer)*

它比格式二只是多了一个outer,这个outer的作用是在UDTF转换列的时候将其中的空也给展示出来,UDTF默认是忽略输出空的,加上outer之后,会将空也输出,显示为NULL。
这个功能是在Hive0.12是开始支持的。

使用LATERAL VIEW + explode 函数进行查询,语句如下:
select movie,category_name 
from movie_info
LATERAL VIEW explode(category) tmpTable as category_name;
-- category_name 是给 explode(category) 列起的别名

结果如下:

阿布

源自灵魂深处的自我救赎。

文章评论