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
group by id;
select id,
concat_ws(',',collect_list(tag_new)) as tag_col
from t_column_to_row
group by id;
Impala
Impala 不支持 hive COLLECT_SET函数的方式,使用GROUP_CONCAT函数+SPLIT_PART函数替代
## IMPALA
SELECT SCORE,SPLIT_PART(GROUP_CONCAT(NAME),',',1) FROM TEST.STUDENT GROUP BY SCORE
## HIVE
SELECT SCORE,COLLECT_SET(NAME)[0] FROM TEST.STUDENT GROUP BY 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
where
group by a.zhusulvguan
文章来源:https://www.toymoban.com/news/detail-517485.html
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
where group by a.zhusulvguan
文章来源地址https://www.toymoban.com/news/detail-517485.html
总结:
①group_concat(column[,char])函数:把同组中指定的column放到一行中[通过char连接],并且去重(列名去重,值不去重)。
②既然是同组数据的操作,那么group_concat()就要配合group by使用。特别的,group by 分组依据并不强制要求和group_concat(column)指定的column相同(个数,字段名)。
③concat(column1,‘cahr’,column2):column1和column2的值通过cahr连接后合并
到了这里,关于Hive和Impala的行列转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!