hive中的多行多列转换

1. 多行转多列

原表test表存储格式如下,希望进行优化

namesubjectscore
张三语文90
张三数学85
张三英语92
李四语文75
李四数学90
李四英语80
王五语文95
王五数学100
王五英语98

在这里插入图片描述

nameChineseMathEnglish
张三908592
李四759080
王五9510098

方法一:利用str_to_map函数

select name
         ,info['语文'] as Chinese
         ,info['数学'] as Math
         ,info['英语'] as English
  from (select name,str_to_map(concat_ws(',',collect_set(concat_ws(':',subject,cast(score as string))))) as info
          from test
         group by name
             ) a 

方法二:利用case when函数

select name
      ,max(case when subject = '语文' then score else 0 end) as Chinese
      ,max(case when subject = '数学' then score else 0 end) as Math
      ,max(case when subject = '英语' then score else 0 end) as English
  from test
 group by name

2. 多列转多行
在数据可视化时如果表很宽很短会显得不那么好看,这个时候可以将数据转成瘦长的格式

dateuvnewuvvideonewvideovvvip_numnew_vip_num
2019-05-1050000002000003000000100002000000050000080000

在这里插入图片描述

datelabelvalue
2019-05-10UV5000000
2019-05-10新增UV200000
2019-05-10视频存量3000000
2019-05-10新增视频10000
2019-05-10播放量20000000
2019-05-10会员数500000
2019-05-10新增会员数80000

实现方法:

select a.date
      ,b.label
      ,b.value
  from (select *
          from daily_report
           ) a 
     LATERAL VIEW explode (map(
             'UV', uv
             ,'新增UV', newuv 
             ,'视频存量', video
             ,'新增视频', newvideo
             ,'播放量', vv
             ,'会员数', vip_num
             ,'新增会员数', new_vip_num
               )) b as label, value
  • 7
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
回答: 在Hive,将多行转换多列可以使用多种方法。其一种方法是使用SQL语句的UNION ALL操作符,将多个查询结果合并为一个结果集。例如,可以使用以下SQL语句将多行转换多列: ``` select col1, 'c' as col2, col2 as col3 from col2row1 UNION ALL select col1, 'd' as col2, col3 as col3 from col2row1 UNION ALL select col1, 'e' as col2, col4 as col3 from col2row1; ``` 这个SQL语句将col2row1表的数据按照指定的列进行组合,每个查询结果都会添加一个新的列,最终得到的结果集将包含多个列。\[2\] 另一种方法是使用Hive的lateral view和explode函数。这个方法适用于一列包含多个数据的情况,比如Map或array。可以使用以下SQL语句将多行转换多列: ``` select col1, col2, lv.col3 as col3 from col2row2 lateral view explode(split(col3, ',')) lv as col3; ``` 这个SQL语句使用explode函数将col3列的数据切分为多个行,并将其展示为多列的形式。\[3\] 总结起来,Hive可以使用UNION ALL操作符或lateral view和explode函数来实现多行多列的操作。具体使用哪种方法取决于数据的结构和需求。 #### 引用[.reference_title] - *1* *2* *3* [Hive多行多列多列多行](https://blog.csdn.net/weixin_44870066/article/details/128006898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值