Hive
explode+lateral
group by+collect_list
一、列转行 (对某列拆分,形成新列)
使用函数:lateral view explode(split(column, ‘,’)) num
eg: 如表:t_row_to_column_tmp 数据如下,对tag列进行拆分
select id,tag,tag_new
from t_row_to_column_tmp
lateral view explode(split(tag,',')) num as tag_new
where id=212022894;
二、行转列 (根据主键,对某列进行合并)
使用函数:concat_ws(‘,’,collect_set(column))
说明:collect_list 不去重,collect_set 去重。 column 的数据类型要求是 string
eg:如表:t_column_to_row ,根据id,对tag_new 进行合并
select id,
concat_ws(',',collect_set(tag_new))as tag_col
from t_column_to_row
groupby id;
select id,
concat_ws(',',collect_list(tag_new))as tag_col
from t_column_to_row
groupby id;
Impala
Impala 不支持 hive COLLECT_SET函数的方式,使用GROUP_CONCAT函数+SPLIT_PART函数替代
## IMPALASELECT SCORE,SPLIT_PART(GROUP_CONCAT(NAME),',',1)FROM TEST.STUDENT GROUPBY SCORE
## HIVESELECT SCORE,COLLECT_SET(NAME)[0]FROM TEST.STUDENT GROUPBY SCORE
例子:
select
a.zhusulvguan,group_concat(b.peopleid,','),group_concat(b.peopleid2,',')from
table_lvguan a join table_people b on b.zhusulvguanId = a.zhusulvguanId
wheregroupby a.zhusulvguan
select
a.zhusulvguan,concat(group_concat(b.peopleid,','),',',group_concat(b.peopleid2,',')) peopleidall
from
table_lvguan a join table_people b on b.zhusulvguanId = a.zhusulvguanId
wheregroupby a.zhusulvguan
总结:
①group_concat(column[,char])函数:把同组中指定的column放到一行中[通过char连接],并且去重(列名去重,值不去重)。
②既然是同组数据的操作,那么group_concat()就要配合groupby使用。特别的,groupby 分组依据并不强制要求和group_concat(column)指定的column相同(个数,字段名)。
③concat(column1,‘cahr’,column2):column1和column2的值通过cahr连接后合并
版权归原作者 KeepHadoop 所有, 如有侵权,请联系我们删除。