Hive多维统计分析案例实战
目录
0 需求描述
1 数据结构
2 准备工作
2.1 准备表
2.2 安装TEZ计算引擎
3 业务分析
3.1 统计视频观看数Top10
3.2 统计视频类别热度Top10
3.3 统计出视频观看数最高的20个视频的所属类别以及类别包含Top20视频的个数
3.4 统计视频观看数Top50所关联视频的所属类别排序
3.5 统计每个类别中的视频热度Top10,以Music为例
3.6 统计每个类别视频观看数Top10
3.7 统计上传视频最多的用户Top10以及他们上传的视频观看次数在前20的视频
0 需求描述
统计爱奇艺视频网站的常规指标,各种TopN指标:(多维分析)
-- 统计视频观看数Top10
-- 统计视频类别热度Top10
-- 统计出视频观看数最高的20个视频的所属类别以及类别包含Top20视频的个数
-- 统计视频观看数Top50所关联视频的所属类别排序
-- 统计每个类别中的视频热度Top10,以Music为例
-- 统计每个类别视频观看数Top10
-- 统计上传视频最多的用户Top10以及他们上传的视频观看次数在前20的视频
1 数据结构
(1)视频表
视频表
字段 |
备注 |
详细描述 |
videoId |
视频唯一id(String) |
11位字符串 |
uploader |
视频上传者(String) |
上传视频的用户名String |
age |
视频年龄(int) |
视频在平台上的整数天 |
category |
视频类别(Array<String>) |
上传视频指定的视频分类 |
length |
视频长度(Int) |
整形数字标识的视频长度 |
views |
观看次数(Int) |
视频被浏览的次数 |
rate |
视频评分(Double) |
满分5分 |
Ratings |
流量(Int) |
视频的流量,整型数字 |
conments |
评论数(Int) |
一个视频的整数评论数 |
relatedId |
相关视频id(Array<String>) |
相关视频的id,最多20个 |
(2)用户表
用户表
字段 |
备注 |
字段类型 |
uploader |
上传者用户名 |
string |
videos |
上传视频数 |
int |
friends |
朋友数量 |
int |
2 准备工作
2.1 准备表
(1)需要准备的表
创建原始数据表:gulivideo_ori,gulivideo_user_ori,
创建最终表:gulivideo_orc,gulivideo_user_orc
(2)创建原始数据表
1)gulivideo_ori
create table gulivideo_ori(videoId string,uploader string,age int,category array<string>,length int,views int,rate float,ratings int,comments int,relatedId array<string>)row format delimited fields terminated by "\t"collection items terminated by "&"stored as textfile;
2)创建原始数据表: gulivideo_user_ori
create table gulivideo_user_ori(uploader string,videos int,friends int)row format delimitedfields terminated by "\t"stored as textfile;
(3)创建orc存储格式带snappy压缩的表:
(1)gulivideo_orc
create table gulivideo_orc(videoId string,uploader string,age int,category array<string>,length int,views int,rate float,ratings int,comments int,relatedId array<string>)stored as orctblproperties("orc.compress"="SNAPPY");
(2)gulivideo_user_orc
create table gulivideo_user_orc(uploader string,videos int,friends int)row format delimitedfields terminated by "\t"stored as orctblproperties("orc.compress"="SNAPPY");
(3)向ori表插入数据
load data local inpath "/opt/module/data/video" into table gulivideo_ori;load data local inpath "/opt/module/user" into table gulivideo_user_ori;
(4)向orc表插入数据
insert into table gulivideo_orc select * from gulivideo_ori;insert into table gulivideo_user_orc select * from gulivideo_user_ori;
2.2 安装TEZ计算引擎
Tez是一个Hive的运行引擎,性能优于MR。为什么优于MR呢?看下。
用Hive直接编写MR程序,假设有四个有依赖关系的MR作业,上图中,绿色是Reduce Task,云状表示写屏蔽,需要将中间结果持久化写到HDFS。
Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。
1)将tez安装包拷贝到集群,并解压tar包
[root@hadoop102 software]$ mkdir /opt/module/tez[root@hadoop102 software]$ tar -zxvf /opt/software/tez-0.10.1-SNAPSHOT-minimal.tar.gz -C /opt/module/tez
2)上传tez依赖到HDFS
[root@hadoop102 software]$ hadoop fs -mkdir /tez[root@hadoop102 software]$ hadoop fs -put /opt/software/tez-0.10.1-SNAPSHOT.tar.gz /tez
3)新建tez-site.xml
[root@hadoop102 software]$ vim $HADOOP_HOME/etc/hadoop/tez-site.xml
添加如下内容:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>tez.lib.uris</name><value>${fs.defaultFS}/tez/tez-0.10.1-SNAPSHOT.tar.gz</value></property><property><name>tez.use.cluster.hadoop-libs</name><value>true</value></property><property><name>tez.am.resource.memory.mb</name><value>1024</value></property><property><name>tez.am.resource.cpu.vcores</name><value>1</value></property><property><name>tez.container.max.java.heap.fraction</name><value>0.4</value></property><property><name>tez.task.resource.memory.mb</name><value>1024</value></property><property><name>tez.task.resource.cpu.vcores</name><value>1</value></property></configuration>
4)修改Hadoop环境变量
[root@hadoop102 software]$ vim $HADOOP_HOME/etc/hadoop/shellprofile.d/tez.sh
添加Tez的Jar包相关信息
hadoop_add_profile tezfunction _tez_hadoop_classpath{hadoop_add_classpath "$HADOOP_HOME/etc/hadoop" afterhadoop_add_classpath "/opt/module/tez/*" afterhadoop_add_classpath "/opt/module/tez/lib/*" after}
5)修改Hive的计算引擎
[root@hadoop102 software]$ vim $HIVE_HOME/conf/hive-site.xml
添加
<property><name>hive.execution.engine</name><value>tez</value></property><property><name>hive.tez.container.size</name><value>1024</value></property>
6)解决日志Jar包冲突
[root@hadoop102 software]$ rm /opt/module/tez/lib/slf4j-log4j12-1.7.10.jar
3 业务分析
3.1 统计视频观看数Top10
思路:使用order by按照views字段做一个全局排序即可,同时我们设置只显示前10条。
最终代码:
SELECTvideoId,viewsFROMgulivideo_orcORDER BYviews DESCLIMIT 10;
3.2 统计视频类别热度Top10
思路:
- (1)即统计每个类别有多少个视频,显示出包含视频最多的前10个类别。
- (2)我们需要按照类别group by聚合,然后count组内的videoId个数即可。
- (3)因为当前表结构为:一个视频对应一个或多个类别。所以如果要group by类别,需要先将类别进行列转行(展开),然后再进行count即可。
- (4)最后按照热度排序,显示前10条。
最终代码:
SELECTt1.category_name ,COUNT(t1.videoId) hotFROM(SELECTvideoId,category_nameFROMgulivideo_orclateral VIEW explode(category) gulivideo_orc_tmp AS category_name) t1GROUP BYt1.category_nameORDER BYhotDESCLIMIT 10
3.3 统计出视频观看数最高的20个视频的所属类别以及类别包含Top20视频的个数
思路:
- (1)先找到观看数最高的20个视频所属条目的所有信息,降序排列
- (2)把这20条信息中的category分裂出来(列转行)
- (3)最后查询视频分类名称和该分类下有多少个Top20的视频
最终代码:
SELECTt2.category_name,COUNT(t2.videoId) video_sumFROM(SELECTt1.videoId,category_nameFROM(SELECTvideoId,views ,categoryFROMgulivideo_orcORDER BYviewsDESCLIMIT 20) t1lateral VIEW explode(t1.category) t1_tmp AS category_name) t2GROUP BY t2.category_name
3.4 统计视频观看数Top50所关联视频的所属类别排序
代码:
SELECTt6.category_name,t6.video_sum,rank() over(ORDER BY t6.video_sum DESC ) rkFROM(SELECTt5.category_name,COUNT(t5.relatedid_id) video_sumFROM(SELECTt4.relatedid_id,category_nameFROM(SELECTt2.relatedid_id ,t3.categoryFROM(SELECTrelatedid_idFROM(SELECTvideoId,views,relatedidFROMgulivideo_orcORDER BYviewsDESCLIMIT 50)t1lateral VIEW explode(t1.relatedid) t1_tmp AS relatedid_id)t2JOINgulivideo_orc t3ONt2.relatedid_id = t3.videoId) t4lateral VIEW explode(t4.category) t4_tmp AS category_name) t5GROUP BYt5.category_nameORDER BYvideo_sumDESC) t6
3.5 统计每个类别中的视频热度Top10,以Music为例
思路:
- (1)要想统计Music类别中的视频热度Top10,需要先找到Music类别,那么就需要将category展开,所以可以创建一张表用于存放categoryId展开的数据。
- (2)向category展开的表中插入数据。
- (3)统计对应类别(Music)中的视频热度。
统计Music类别的Top10(也可以统计其他)
SELECTt1.videoId,t1.views,t1.category_nameFROM(SELECTvideoId,views,category_nameFROM gulivideo_orclateral VIEW explode(category) gulivideo_orc_tmp AS category_name)t1 WHEREt1.category_name = "Music"ORDER BYt1.viewsDESCLIMIT 10
3.6 统计每个类别视频观看数Top10
最终代码:
SELECTt2.videoId,t2.views,t2.category_name,t2.rkFROM(SELECTt1.videoId,t1.views,t1.category_name,rank() over(PARTITION BY t1.category_name ORDER BY t1.views DESC ) rkFROM (SELECTvideoId,views,category_nameFROM gulivideo_orclateral VIEW explode(category) gulivideo_orc_tmp AS category_name)t1)t2WHERE t2.rk <=10
3.7 统计上传视频最多的用户Top10以及他们上传的视频观看次数在前20的视频
思路:
- (1)求出上传视频最多的10个用户
- (2)关联gulivideo_orc表,求出这10个用户上传的所有的视频,按照观看数取前20
最终代码:
SELECTt2.videoId,t2.views,t2.uploaderFROM(SELECTuploader,videosFROM gulivideo_user_orcORDER BYvideosDESCLIMIT 10 ) t1JOIN gulivideo_orc t2ON t1.uploader = t2.uploaderORDER BYt2.viewsDESC
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路
Hive多维统计分析案例实战相关推荐
- OpenCV C++案例实战三《二维码检测》
OpenCV C++案例实战三<二维码检测> 前言 一.二维码检测 二.二维码识别 1.通过findContours找到轮廓层级关系 三.二维码绘制 四.源码 总结 前言 本文将使用Ope ...
- 1+X 云计算运维与开发(中级)案例实战——搭建harbor私有仓库并实现主从同步
1+X 云计算运维与开发(中级)案例实战--搭建harbor私有仓库并实现主从同步 前言 思路 实操 1.(个人习惯)修改主机名,添加主机映射 2. 配置镜像加速器 3. 生成CA证书,并分发证书 4 ...
- 1+X 云计算运维与开发(中级)案例实战——使用 Mycat 构建读写分离的数据库集群
1+X 云计算运维与开发(中级)案例实战--使用 Mycat 服务构建读写分离的数据库集群 前言 思路 实操 1.修改主机名,修改主机映射,配置yum源 2.给mycat机安装java服务,给db1和 ...
- 1+X 云计算运维与开发(初级)案例实战——Docker基础(1)
1+X 云计算运维与开发(初级)案例实战--Docker基础(1) 前言 思路 实操 1.配置yum源 2.升级内核 3.配置防火墙 4.开启路由转发 5.安装依赖包 总结 前言 学而不思则罔,思而不 ...
- 【项目实战课】快速上手目标检测任务,MMdetection框架详细解读与案例实战
欢迎大家来到我们的项目实战课,本期内容是<MMdetection框架解读与案例实战>. 所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲 ...
- 力作推荐!!!! 防线:企业Linux安全运维理念和实战(向世界500强企业学习Linux安全管理与运维之道)...
防线:企业Linux安全运维理念和实战(向世界500强企业学习Linux安全管理与运维之道) 新书发售 http://product.dangdang.com/product.aspx?pr ...
- 【案例实战】餐饮企业分店财务数据分析系统解决方案:业务需求
[案例实战]餐饮企业分店财务数据分析系统解决方案:业务需求 一.建设目的 某餐饮集团需要将每个分店的财务状况进行分析,目前使用的是excel来存储查看各区域的收入情况,每个区域各年月的收入情况汇总数据 ...
- Spark案例实战教程
Spark案例实战 实战代码参考:GitHub - GoAlers/Bigdata_project: 电商大数据项目-推荐系统(java和scala语言) 搭建项目 pom参考 <depende ...
- 荣欣Linux运维+Oracle DBA实战训练
课程阶段说明与详细大纲: ◇ 第一阶段:企业版Linux系统运维基础.项目实战:112课时 ◇ 第二阶段:基于互联网门户Linux应用集群与Mysql数据库集群架构设计与维护,项目实战:112课时 ◇ ...
最新文章
- 带无线驱动的linux版本,怎么在Linux里查询无线网卡的驱动程序版本
- GT Transceiver中的重要时钟及其关系(4)CPLL的工作原理介绍
- Ubuntu 上 Node.js 安装和卸载
- Word字体与像素的对应关系(转)
- 蓝桥杯练习系统习题-历年真题解析1(完整版)
- django开发商城(提供初始数据,商城首页及购物车)
- android 滚动到底部,Android 控制ScrollView滚动到底部(示例代码)
- H3C-IMC 自动发现功能如何使用
- 浅析B/S架构数据库连接方式
- php实现标签打印,标签打印软件怎么实现批量套打标签?
- 使用Eclipse设置java源代码 连接
- python目前版本强势英雄_最强竟然不是灭霸|用Python给漫威和DC英雄综合实力排位...
- 《平衡掌控者》笔记(结)
- SpringCloud平滑升级/优雅停机
- 你知道Base64编码的图片吗
- airpods链接mac弹窗_AirPods怎么连接Mac AirPods连接Mac教程
- python对excel操作简书_python Excel 写
- 将数字上调至8的倍数
- Python绘制Mandelbrot Set与Julia Set
- 七年级下册信息技术认识计算机硬件,七年级信息技术下册