当前位置: 首页 > article >正文

【Hive sql 面试题】统计Top3歌单以及每个Top3歌单下的Top3歌曲(难)

表数据如下:

1	1	经典老歌	1	月亮代表我的心
2	1	经典老歌	1	月亮代表我的心
3	1	经典老歌	3	夜来香
4	1	经典老歌	4	我只在乎你
5	1	经典老歌	5	千言万语
6	1	经典老歌	5	千言万语
7	2	流行金曲	7	突然好想你
8	2	流行金曲	8	后来
9	2	流行金曲	9	童话
10	2	流行金曲	10	晴天
11	2	流行金曲	7	突然好想你
12	2	流行金曲	7	突然好想你
13	3	纯音乐集	13	二泉映月
14	3	纯音乐集	14	琵琶语
15	3	纯音乐集	15	梦回还
16	4	欧美音乐	16	Shape of My Heart
17	4	欧美音乐	17	Just the Way You Are
18	4	欧美音乐	18	Hello
19	4	欧美音乐	19	A Thousand Years
20	4	欧美音乐	20	Thinking Out Loud
21	4	欧美音乐	20	Thinking Out Loud
22	4	欧美音乐	18	Hello
23	4	欧美音乐	18	Hello
24	5	民谣时光	24	易燃易爆炸
25	5	民谣时光	25	成全
26	5	民谣时光	25	成全
27	5	民谣时光	25	成全

将数据上传到 linux 并将其加载到hive 表中

建表和加载数据:

create table music(
    uid int,
    musiclist_id int,
    musiclist_name string,
    music_id int,
    music_name string
)
row format delimited
fields terminated by '\t';

load data local inpath '/home/hivedata/music.txt' into table music;

在这里插入图片描述

解题思路和答案

思路:

核心:

先求出 Top3 歌单,再求出 每个Top3 歌单下面的 Top3 歌曲

1、根据歌单(musiclist_name)分组 count() ,然后拿到次数最多的三个歌单,就是 Top3 歌单

2、将 Top3 歌单与 最开始的music 关联起来,就能拿到 Top3 歌单下面的所有歌曲

3、将关联起来的表通过歌单(musiclist_name)和歌曲(music_name)分组 count() ,就可以拿到每个歌单下的每个歌曲播放次数

4、将播放次数排名( row_number() )

5、根据歌曲排名过滤(where),筛选排名小于等于 3 的,就是 Top3 歌曲

代码:

with t1 as (
	-- 思路第一步形成 t1 表
    select musiclist_name,count(*) from music group by musiclist_name order by count(*) desc limit 3
),t2 as (
	-- 思路第二步形成 t2 表
    select music.musiclist_name,music.music_name from t1 join music on t1.musiclist_name = music.musiclist_name
),t3 as (
	-- 思路第三步形成 t3 表
    select musiclist_name,music_name,count(*) count from t2 group by musiclist_name,music_name
),t4 as (
	-- 思路第四步形成 t4 表
    select *,row_number() over (partition by musiclist_name order by count desc) rowNum from t3
)
-- 思路第五步拿到结果
select musiclist_name,music_name from t4 where rowNum <= 3;

运行结果:

在这里插入图片描述

有人可能没有用过 with t1 as()的用法:

就是将查询出来的结果,变成临时表 t ,提供给下面的查询语句使用


http://www.kler.cn/a/378985.html

相关文章:

  • el-upload,上传文件,后端提示信息,前端需要再次重新上传(不用重新选择文件)
  • 什么是虚拟dom,如何实现一个虚拟dom
  • 数据结构 —— AVL树
  • 代码随想录训练营Day15 | 530.二叉搜索树的最小绝对差 - 501.二叉搜索树中的众数 - 236. 二叉树的最近公共祖先
  • 【LQB15_模拟】C风险对冲
  • 大数据-206 数据挖掘 机器学习理论 - 多元线性回归 回归算法实现 算法评估指标
  • 【青牛科技】GC4931P替代A4931/Allegro在水泵、筋膜枪、吸尘器和电动工具中的应用
  • 多角色AI代理的一次尝试- AI代码助手
  • Redis 数据备份与恢复
  • GOF的C++软件设计模式的分类和模式名称
  • 系统架构设计师(软考高级)一站式通关课程
  • JSON交互处理
  • 网络规划设计师-(4)数据调制与编码
  • 基于matlab的人脸识别系统设计与仿真
  • 【反射率】-- Lab 转换(excel)
  • 力扣排序242题 有效的子母异位词
  • 计算机网络:网络层 —— 多播路由选择协议
  • 【Java SE】String
  • Nginx 使用指南
  • CentOS 7 软件/程序安装示例
  • 下载pytorch报错:没有发现某个版本
  • PostgreSQL11 | PostgreSQL用户管理(上篇)
  • 构建工具-webpack和vite笔记
  • 无桥图腾柱PFC原理及MATLAB仿真
  • M3U8直播,视频切片 AES加密,多码流自适应
  • npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。