目录

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多维统计分析案例实战相关推荐

  1. OpenCV C++案例实战三《二维码检测》

    OpenCV C++案例实战三<二维码检测> 前言 一.二维码检测 二.二维码识别 1.通过findContours找到轮廓层级关系 三.二维码绘制 四.源码 总结 前言 本文将使用Ope ...

  2. 1+X 云计算运维与开发(中级)案例实战——搭建harbor私有仓库并实现主从同步

    1+X 云计算运维与开发(中级)案例实战--搭建harbor私有仓库并实现主从同步 前言 思路 实操 1.(个人习惯)修改主机名,添加主机映射 2. 配置镜像加速器 3. 生成CA证书,并分发证书 4 ...

  3. 1+X 云计算运维与开发(中级)案例实战——使用 Mycat 构建读写分离的数据库集群

    1+X 云计算运维与开发(中级)案例实战--使用 Mycat 服务构建读写分离的数据库集群 前言 思路 实操 1.修改主机名,修改主机映射,配置yum源 2.给mycat机安装java服务,给db1和 ...

  4. 1+X 云计算运维与开发(初级)案例实战——Docker基础(1)

    1+X 云计算运维与开发(初级)案例实战--Docker基础(1) 前言 思路 实操 1.配置yum源 2.升级内核 3.配置防火墙 4.开启路由转发 5.安装依赖包 总结 前言 学而不思则罔,思而不 ...

  5. 【项目实战课】快速上手目标检测任务,MMdetection框架详细解读与案例实战

    欢迎大家来到我们的项目实战课,本期内容是<MMdetection框架解读与案例实战>. 所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲 ...

  6. 力作推荐!!!!   防线:企业Linux安全运维理念和实战(向世界500强企业学习Linux安全管理与运维之道)...

    防线:企业Linux安全运维理念和实战(向世界500强企业学习Linux安全管理与运维之道)      新书发售 http://product.dangdang.com/product.aspx?pr ...

  7. 【案例实战】餐饮企业分店财务数据分析系统解决方案:业务需求

    [案例实战]餐饮企业分店财务数据分析系统解决方案:业务需求 一.建设目的 某餐饮集团需要将每个分店的财务状况进行分析,目前使用的是excel来存储查看各区域的收入情况,每个区域各年月的收入情况汇总数据 ...

  8. Spark案例实战教程

    Spark案例实战 实战代码参考:GitHub - GoAlers/Bigdata_project: 电商大数据项目-推荐系统(java和scala语言) 搭建项目 pom参考 <depende ...

  9. 荣欣Linux运维+Oracle DBA实战训练

    课程阶段说明与详细大纲: ◇ 第一阶段:企业版Linux系统运维基础.项目实战:112课时 ◇ 第二阶段:基于互联网门户Linux应用集群与Mysql数据库集群架构设计与维护,项目实战:112课时 ◇ ...

最新文章

  1. 带无线驱动的linux版本,怎么在Linux里查询无线网卡的驱动程序版本
  2. GT Transceiver中的重要时钟及其关系(4)CPLL的工作原理介绍
  3. Ubuntu 上 Node.js 安装和卸载
  4. Word字体与像素的对应关系(转)
  5. 蓝桥杯练习系统习题-历年真题解析1(完整版)
  6. django开发商城(提供初始数据,商城首页及购物车)
  7. android 滚动到底部,Android 控制ScrollView滚动到底部(示例代码)
  8. H3C-IMC 自动发现功能如何使用
  9. 浅析B/S架构数据库连接方式
  10. php实现标签打印,标签打印软件怎么实现批量套打标签?
  11. 使用Eclipse设置java源代码 连接
  12. python目前版本强势英雄_最强竟然不是灭霸|用Python给漫威和DC英雄综合实力排位...
  13. 《平衡掌控者》笔记(结)
  14. SpringCloud平滑升级/优雅停机
  15. 你知道Base64编码的图片吗
  16. airpods链接mac弹窗_AirPods怎么连接Mac AirPods连接Mac教程
  17. python对excel操作简书_python Excel 写
  18. 将数字上调至8的倍数
  19. Python绘制Mandelbrot Set与Julia Set
  20. 七年级下册信息技术认识计算机硬件,七年级信息技术下册

热门文章

  1. 2020-11-04课堂笔记之JQuery
  2. 用unity画抛物面
  3. leetcode: 91. 解码方法
  4. android:ellipsize的使用
  5. 【苏格拉底言行录】 第四卷
  6. 九阴服务器维护,《九阴真经》-官方网站-一亿人的真武侠梦,开创全自由空中打斗...
  7. 江西省宜春市谷歌高清卫星地图下载
  8. python操作protobuf基础
  9. 您的连接不是私密连接(Chrome)
  10. Android zip文件下载和解压