0
点赞
收藏
分享

微信扫一扫

对比mysql和hive:分组,取不同组前几条记录-explode函数的使用


1、数据源如下

id,name,age,favors(爱好)
1,huangxiaoming,45,a-c-d-f
2,huangzitao,36,b-c-d-e
3,huanglei,41,c-d-e
4,liushishi,22,a-d-e
5,liudehua,39,e-f-d
6,liuyifei,35,a-d-e

2、建表语句

create table mian6(
id int,
name string,
age int,
favors string
)row format delimited fields terminated by ",";

3、加载数据

load data local inpath "/home/hadoop/apps/mian6.txt" into table mian6;

4、需求如下

  • 求出每种爱好中,年龄最大的两个人(爱好,年龄,姓名)

5、实现步骤如下

1)创建一个表mian6_1,存储使用explode炸裂favors后的结果。

create table mian6_1 as
select
m.id id,
m.name name,
m.age age,
m.favors favors,
tf.hobby hobby
from
mian6 m
lateral view explode(split(m.favors,"-")) tf as hobby;

explode炸裂favors后的结果如下:

对比mysql和hive:分组,取不同组前几条记录-explode函数的使用_hive面试题

2)查询出,每个兴趣内部的排名(每个兴趣内部,按照age降序排列)。

select 
m.hobby,
m.name name,
m.age age,
m.favors favors,
row_number() over(partition by hobby order by age desc) index
from
mian6_1 m;

查询结果如下:

对比mysql和hive:分组,取不同组前几条记录-explode函数的使用_hadoop_02

3)在第二步的基础上,挑选出每个兴趣内部,排名前二的2条记录。

select 
a.hobby,
a.name,
a.age,
a.favors
from
(select m.name name,m.hobby hobby,m.age age,m.favors favors,
row_number() over(partition by hobby order by age desc) index
from mian6_1 m)a
where a.index<=2;

查询结果如下:

对比mysql和hive:分组,取不同组前几条记录-explode函数的使用_hadoop_03


举报

相关推荐

0 条评论