irpas技术客

hive的lateral view 与 explode函数的使用_xuehuagongzi000_lateral view 序号

未知 4720

主要介绍explode和posexplode函数的使用。类似于flatmap把一个数组打散

lateral view 侧视图。原表的每一行和explode_lateral_view进行笛卡尔积关联,也可以多重使用

1、数据介绍

先看下我们的数据,主要包括三列,分别是班级、姓名以及成绩,数据表名是default.classinfo。

2、单列Explode

首先来看下最基本的,我们如何把student这一列中的数据由一行变成多行。这里需要使用split和explode,并结合lateral view实现。代码如下:

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

3、单列Posexplode

接下来,我们想要给每个同学来一个编号,假设编号就按姓名的顺序,此时我们要用到另一个hive函数,叫做posexplode,代码如下:

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

这里select时对编号+1主要是因为编号是从0开始的,结果如下:

?

4、多列Explode

好了,我们继续前进。这次我们想基于两列explode,同时能够使学生和其成绩能够匹配,即期望的效果如下:

显然我们要对两列进行explode,先试试行不行:

select class,student_name,student_score from default.classinfo lateral view explode(split(student,',')) sn as student_name lateral view explode(split(score,',')) sc as student_score

好像是不太行,如果我们分别对两列进行explode的话,假设每列都有三个值,那么最终会变成3 * 3 = 9行。但我们想要的结果只有三行。此时我们可以进行两次posexplode,姓名和成绩都保留对应的序号,即使变成了9行,我们通过where条件只保留序号相同的行即可。代码如下:

select class,student_name,student_score from default.classinfo lateral view posexplode(split(student,',')) sn as student_index_sn,student_name lateral view posexplode(split(score,',')) sc as student_index_sc,student_score where student_index_sn = student_index_sc

此时结果就对了:

?

好了,到这里本应该就结束了,假设我们又想对同学的成绩进行一下排名该怎么做呢?当然是借助rank函数啦(row_number函数对于相同的成绩也会赋予不同的排名,所以我们选择rank函数

select class, student_name, student_score, rank() over(partition by class order by student_score desc) as student_rank from default.classinfo lateral view posexplode(split(student,',')) sn as student_index_sn,student_name lateral view posexplode(split(score,',')) sc as student_index_sc,student_score where student_index_sn = student_index_sc

结果符合我们预期:

?

?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #lateral #View #序号 #侧视图