zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

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

2023-03-15 23:29:32 时间

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后的结果如下:

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;

查询结果如下:

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;

查询结果如下: