大数据技术之_08_Hive学习_05
第10章 Hive实战之谷粒影音
10.1 需求描述
统计硅谷影音视频网站的常规指标,各种TopN指标:
- 统计视频观看数Top10
- 统计视频类别热度Top10
- 统计出视频观看数最高的20个视频的所属视频类别以及对应视频类别的个数
- 统计视频观看数Top50所关联视频的所属类别Rank
- 统计每个类别中的视频热度Top10
- 统计每个类别中视频流量Top10
- 统计上传视频最多的用户Top10以及他们上传的视频
- 统计每个类别视频观看数Top10
10.2 项目
10.2.1 数据结构
1、视频表
字段 | 备注 | 详细描述 |
---|---|---|
video id | 视频唯一id | 11位字符串 |
uploader | 视频上传者 | 上传视频的用户名String |
age | 视频年龄 | 视频在平台上的整数天 |
category | 视频类别 | 上传视频指定的视频分类 |
length | 视频长度 | 整形数字标识的视频长度 |
views | 观看次数 | 视频被浏览的次数 |
rate | 视频评分 | 满分5分 |
ratings | 流量 | 视频的流量,整型数字 |
conments | 评论数 | 一个视频的整数评论数 |
related ids | 相关视频id | 相关视频的id,最多20个 |
2、用户表
字段 | 备注 | 字段类型 |
---|---|---|
uploader | 上传者用户名 | string |
videos | 上传视频数 | int |
friends | 朋友数量 | int |
10.2.2 ETL原始数据
通过观察原始数据形式,可以发现,视频可以有多个所属分类,每个所属分类用&符号分割,且分割的两边有空格字符,同时相关视频也是可以有多个元素,多个相关视频又用“\t”进行分割。为了分析数据时方便对存在多个子元素的数据进行操作,我们首先进行数据重组清洗操作
。即:将所有的类别用“&”分割,同时去掉两边空格,多个相关视频id也使用“&”进行分割。
0、添加依赖pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
</dependency>
</dependencies>
1、ETL之ETLUtil
package com.atguigu;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
/**
* @author chenmingjun
* @date 2019-03-01 15:48
*/
public class ETLUtil {
public static String oriString2ETLString(String ori) {
// 0.切割数据
String[] fields = ori.split("\t");
// 1.过滤脏数据(不符合要求的数据)
if (fields.length < 9) {
return null;
}
// 2.将类别字段中的" " 替换为""(即去掉类别字段中的空格)
fields[3] = fields[3].replace(" ", "");
// 3.替换关联视频字段分隔符"\t"替换为"&"
StringBuffer sb = new StringBuffer();
for (int i = 0; i < fields.length; i++) {
// 关联视频字段之前的数据
if (i < 9) {
if (i == fields.length -1) {
sb.append(fields[i]);
} else {
sb.append(fields[i] + "\t");
}
} else {
// 关联视频字段的数据
if (i == fields.length -1) {
sb.append(fields[i]);
} else {
sb.append(fields[i] + "&");
}
}
}
// 得到的数据格式为:bqZauhidT1w bungloid 592 Film&Animation 28 374550 4.19 3588 1763 QJ5mXzC1YbQ&geEBYTZ4EB8
return sb.toString();
}
}
2、ETL之Mapper
package com.atguigu;
import org.apache.commons.lang.StringUtils