Hive列转行 (Lateral View + explode)

需求:

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

转成如下格式:

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


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

Step1:建表movie_info:

--对电影的风格使用数组,所以建表时要标明数组的分隔符语句  ——  collection items terminated by ","
create table movie_info(
    movie string,
    category array<string>)
row format delimited 
fields terminated by "\t"
collection items terminated by ","; 


-- 插入数据
load data local inpath "/usr/local/src/test4/hive/movie_info.txt" into table movie_info;

查询表格:

此时可以看到category是一个数组,并且分隔符为",";

Step2:explode的使用:

explode作用:处理map结构的字段,将数组转换成多行  ==》  所以我们现在先对category使用category函数:

select explode(category) from movie_info;

结果:

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

如果我们直接

select  movie,explode(category) from movie_info;

查询直接报错,因为movie的结果只有三条,而explode(category)有 4 + 5 + 3 = 12条记录。

那么,我们由此引入LATERAL VIEW函数:

LATERAL VIEW:

1.Lateral View 用于和UDTF函数【explode,split】结合来使用。

2.首先通过UDTF函数将数据拆分成多行,再将多行结果组合成一个支持别名的虚拟表。

3..主要解决在select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。

4.语法:LATERAL VIEW udtf(expression)  tableAlias AS columnAlias (',' columnAlias)

使用LATERAL VIEW  +  explode  函数进行查询,语句如下:

select movie,category_name 
from movie_info
LATERAL VIEW explode(category) tmpTable as category_name;
-- category_name 是给 explode(category) 列起的别名

结果如下:

到此,任务完成。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值