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

举报
yd_226342373 发表于 2021/05/20 01:16:45 2021/05/20
【摘要】 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 1234567 2、建表语句 creat...

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、建表语句

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3、加载数据

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

  
 
  • 1

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;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

查询结果如下:
在这里插入图片描述

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;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查询结果如下:
在这里插入图片描述

文章来源: blog.csdn.net,作者:数据分析与统计学之美,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41261833/article/details/103479328

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。