数据分析EPHS(10)-Hive中的explode使用全解

好了,接下来咱们来看看如何在Hive中实现一行转多行的操作,主要介绍explode和posexplode函数的使用。

沿用上一节的数据,从简单到复杂,咱们一步步来。

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
order by class,student_rank

结果符合我们预期:

好了,本文就到这里了!下期再见!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 分析函数,也称为窗口函数,通常被认为仅对数据仓库SQL有用。使用分析函数的查询,基于对数据行的分组来计算总量值。与...
    猫猫_tomluo阅读 3,398评论 3 18
  • pyspark.sql module Module context Spark SQL和DataFrames中的重...
    盗梦者_56f2阅读 5,523评论 0 19
  • 从今天开始,我要开始在简书上好好写文章了。 夜终于安静下来。 食品配送中心那闹心的噪音终于停止了。当然我明白凌晨六...
    白藜芦醇阅读 223评论 0 0
  • 前几天看了一期罗胖的知识就是力量,如何重新获得别人的信任。我们去饭店吃饭,吃到一半发现菜里有一只蟑螂,你把服务员叫...
    设计师周文斌阅读 851评论 1 3
  • 明天是孩子在幼儿园的毕业典礼,每当想到要毕业,孩子就很难过,万分不舍,舍不得她的老师和同学们,还有园长叔叔。 春季...
    爱可可_15f2阅读 381评论 0 3