0


Hive和Impala的行列转换

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连接后合并
标签: hive 数据库 hadoop

本文转载自: https://blog.csdn.net/weixin_42615105/article/details/128133904
版权归原作者 KeepHadoop 所有, 如有侵权,请联系我们删除。

“Hive和Impala的行列转换”的评论:

还没有评论