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

你可能感兴趣的:(Hive的行转列和列转行)