Hive的行转列和列转行

1,行转列

原始数据,TableName='test'


image.png

行转列之后数据:
相同部门,相同性别的人在一起


image.png

首先肯定是根据部门和性别分组
select
dept_sex
from
(select
concat_ws(',',deptname,sex) as dept_sex
from
test) w
group by
w.dept_sex

现在已经拿到了dept_sex,然后通过collect_set函数可以将name存储到集合
有collect_set和collect_list两种,区别很简单,和Java一样,set里面没有重复数据,可以用来去重,list里面可以存储重复数据

select
dept_sex,concat_ws('|',collect_set(name))
from
(select
concat_ws(',',deptname,sex) as dept_sex
from
test) w
group by
w.dept_sex

附录concat_ws,collect_set,collect_list官网解释:


image.png

image.png

2,列转行

原始数据:TABLENAME='test2'


image.png

列转行后数据:


image.png

select
name,study_yes
from
test2
lateral view explode(split(study,',')) study_tmp as study_yes

;

附录
split:返回值是数组array


image.png

explode:将数组,数组,数组分解为多行。返回具有单个列(col)的行集,数组中的每个元素对应一行

image.png

laternal view:
Hive的explode爆炸函数使用时候,只能返回explode这一列结果,如果想返回多个列,使用
lateral view explode(split(study,',')) study_tmp相当于一个虚拟表.和原表对应的那一行数据做笛卡尔积,而不是和原表做笛卡尔积,是原表对应的那一行数据.

我的另一篇文章详细的介绍了Hive的later view
https://www.jianshu.com/p/fab7ba5060db

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容