hive - explode 用法以及练习

hive explode 的用法以及练习

一行变多行 explode
例如: 临时表 temp_table ,列名为1st

1st
1,2,3
4,5,6

变为
1
2
3
4
5
6
方式一:直接使用 explode

select   
 explode(split(1st,',')) 
 from temp_table;

方式二:使用 lateral view explode() 临时别名 as 列名

select  
  type
 from  temp_table
 lateral view explode(split(1st,','))  tmp as type;

练习:
数据库表名default.classinfo ,对应列分别是班级,姓名,成绩

classstudentscore
1班A,B,C88,90,77
2班D,E80,92
3班F,G,H95,75,66

练习1:将姓名分开变为一行一个名字

select 
	class ,student_name
from
	default.classinfo
    lateral view explode(split(student,',')) t as student_name;

练习2:给每个同学一个编号,按姓名顺序,从1开始
使用 posexplode 函数

select 
	class,student_index +1 as stu_index,student_name
from
	default.classinfo
	lateral view posexplode(split(student,',')) t as student_index,student_name;

这里+1 是因为编号是从0开始的

练习3:使学生姓名与成绩进行匹配
注意:这里是对两列进行explode,会两两进行匹配,以1班为例,就是 3* 3=9 ,这显然是不对的,此时,就需要用到posexplode
,然后通过where 保留序号相同的行

select 
	class,stu_name,stu_score
from 
	defalult.classinfo
	lateral view posexplode(split(student,',')) sn as stu_n_index,stu_name
	lateral view posexplode(split(score,',')) ss as stu_s_index,stu_score
where
	stu_n_index = stu_s_index

练习4:对每个班的成绩进行排名
注意:

row_number(): 排序的字段值相同时序列号不会重复,如:1、2、(2)3、4、5(出现两个2,第二个2继续编号3)

rank() : 排序的字段值相同时序列号会重复且下一个序列号跳过重复位,如:1、2、2、4、5(出现两个2,跳过序号3,继续编号4)

dense_rank(): 排序的字段值相同时序列号会重复且下一个序列号继续序号自增,如:1、2、2、3、4(出现两个2,继续按照3编号)

这里我们使用rank()

select 
	class,
	stu_name,
	stu_score,
	rank() over(partition by class order by stu_score desc ) as stu_rank

from 
	default.classinfo
	lateral view posexplode(split(student,','))  sn as stu_n_index,stu_name
	lateral view posexplode(split(score,',')) ss as stu_s_index ,stu_score
where
	stu_n_index = stu_s_index
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值