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) 列起的别名
结果如下:
文章评论