比较好用的行转列方法

--练习题

stu_no,stu_name,course,score

1,段瑞,hive,100

1,段瑞,spark,130

1,段瑞,flink,120

1,段瑞,hadoop,100

1,段一,hive,150

1,段一,spark,140

1,段一,flink,150

1,段一,hadoop,160

1,段二,hive,210

1,段二,spark,220

1,段二,flink,240

1,段二,hadoop,220

-- 查询出如下结果

stu_no,stu_name,hive成绩,spark成绩,flink成绩,hadoop成绩

create  table tmp.lianxi(
stu_no int
,stu_name string
,course string
,score int
)
row format delimited fields terminated by ',';
load data local inpath '/root/test1' into table tmp.lianxi;

SELECT
  stu_no 
  ,stu_name
  --上面四个字段按照字典顺序排序之后的顺序就是这样
  ,split(x[0],':')[1]  as `flink成绩`
  ,split(x[1],':')[1]  as `hadoop成绩`
  ,split(x[2],':')[1]  as `hive成绩`
  ,split(x[3],':')[1]  as `spark成绩`
FROM
(
SELECT
   stu_no, 
   stu_name,
   --排序之后的成绩是按照单词的首字母进行排序的,务必按照字典顺序去取数据
   sort_array(collect_list( course || ':' || score )) as x
from tmp.lianxi
group by stu_no, stu_name) o

下面这个方法比较简单,而且可以设置查询的结果的顺序

-------------------------方法二----------------------- 

with tmp as (
select 
   stu_no, 
   stu_name,
   str_to_map(concat_ws('_',collect_list( course || ':' || score )),'_',':') as info
from tmp.lianxi
group by stu_no, stu_name
)
select 
	stu_no, 
    stu_name
	,info['hive'] as `hive成绩`	
	,info['spark'] as `spark成绩`
	,info['flink'] as `flink成绩`
	,info['hadoop'] as `hadoop成绩`
from tmp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值