行转列与列转行的实现

行转列

常用的算子

explode(),posexplode(),lateral view

简单行转列

含义:将一个融合多个信息的字段拆分成一列(多行),简单理解为一行数据变多行数据

举例

结果展示:aaa,bbb,ccc  
            ===>  
         aaa
         bbb
         ccc

步骤:先用split切开按照,进行分隔成数组的形式 ["aaa","bbb","ccc"]
	  然后再用explode函数炸开,将一行分成多行

具体实现:
select explode(split('aaa,bbb,ccc',','));

复杂行转列

含义:将一个融合多个信息的字段拆分成多行并将转换后的多行信息与原表字段关联查询
lateral view侧视图即产生一张虚拟表

举例:

结果展示:
name hobbys
tom  唱歌,跳舞,弹琴
jack 唱歌,绘画,打篮球
======>
name hobby
tom 唱歌
tom 跳舞
tom 弹琴
jack 唱歌
jack 绘画
jack 打篮球

步骤:
//此语句本身返回的就是一张虚拟表 记为temp 可以为temp表的列指定字段名hobby
explode(split(hobby,',')) temp as hobby  
//使用later view可以直接关联两张表,保持原有映射关系
student lateral view temp     

具体实现:
select student.name,temp.hobby from student lateral view explode(split(hobbys,',')) temp as hobby;

列转行

常用的算子

sum(),count(),max(),min(),collect_set(),collect_list()

含义:将一列(多行)数据融合为一行,简单理解为多行数据变一行数据

举例

结果演示:
name hobby
tom  唱歌
tom  跳舞
tom  弹琴
jack 唱歌
jack 绘画
jack 打篮球
======>
name hobbys
tom  唱歌,跳舞,弹琴
jack 唱歌,绘画,打篮球

实现步骤:
据name字段进行分组,在每个分组内部name是唯一的可以直接查询,hobby字段就可以使用collect_set与concat_ws进行连接为复合字段。

具体实现:
select name,concat_ws(’,’,collect_set(hobby)) as hobbys from stu group by name;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值