Hivesql 行转列,列转行详解

hive中行转列
行转列:concat_ws 和collect_set或者collect_list结合使用
collect_set函数是对统计的数据进行去重,然后拼接在一起,返回一个set集合
collect_list是不去重,对所有的值进行拼接然后返回一个list集合
select id,isbook,concat_ws(',', collect_list(cast(time as string))) as List from table group by id,isbook
 
使用 str_to_map(text,delimiter1,delimiter2) 行转列
          将字符串str按照指定分隔符转换成Map,
第一个参数是需要转换字符串,
第二个参数是键值对之间的分隔符,默认为  , ;
第三个参数是键值之间的分隔符, 默认为"="
取用map里的字段,用str_to_map('key:v1;key2:v2',';',':')[key]即可
 
行转列分解
select name,collect_list(concat_ws(':',subject,cast(sorce as string))) as info from test group by name;
将数据转换为字符串
select name ,concat_ws(',',collect_list(concat_ws(':',subject,cast(sorce as string))) ) as info from test group by name
转为map
select name,str_to_map(concat_ws(',',collect_list(concat_ws(':',subject,cast(sorce as string))))) as info from test group by name
行转列
select name
,info['语文'] as Chinese
,info['数学'] as Math
,info['英语'] as English
from
(select name,str_to_map(concat_ws(',',collect_list(concat_ws(':',subject,cast(sorce as string))))) as info from test group by name
) a
 
使用case when  行转列
select
name,
max(case when subject='语文' then score end) as Chinese,
max(case when subject='数学' then score end) as Math,
max(case when subject='英语' then score end) as English
from student_hang group by name;
 
 
 
 
 
 
列转行:
高效函数:
explode就是将hive一行中复杂的array或者map结构拆分成多行
 
LATERAL VIEW explode(split(字段,’,’))是将一个字段拆分展示为多条数据显示,
CONCAT_WS语句,将多个字段拼接起来,两者结合可以满足将一条数据多个特定字段展示为多条数据一个特定字段。
LATERAL VIEW explode(split(CONCAT_WS(’,’,string1,string2,string2)),’,’)) mytable(视图名) AS obj_view(新列名)
实例:
select DEPT_NAME,
       SUM(obj_view)/COUNT(*) as SCORE
  from XXXX表
   LATERAL VIEW explode(split(CONCAT_WS(',',RCOUNT,QCOUNT,SCORE),',')) mytable AS obj_view
   GROUP BY DEPT_NAME
 
使用case  when 列转行
select name,'chinese' subject,chinese as score from student_column
union all
select name,'Math' subject,Math as score from student_column
union all
select name,'English' subject,English as score from student_column;
 
 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值