一、 需求描述
统计硅谷影音视频网站的常规指标,各种 TopN 指标:
–统计视频观看数 Top10
–统计视频类别热度 Top10
–统计视频观看数 Top20 所属类别以及类别包含的 Top20 的视频个数
–统计视频观看数 Top50 所关联视频的所属类别 Rank
–统计每个类别中的视频热度 Top10
–统计每个类别中视频流量 Top10
–统计上传视频最多的用户 Top10 以及他们上传的观看次数在前 20 视频
–统计每个类别视频观看数 Top10
二、项目
2.1 数据结构
1、视频表
2、用户表
2.2 ETL 原始数据
通过观察原始数据形式,可以发现,视频可以有多个所属分类,每个所属分类用&符号分割,且分割的两边有空格字符,同时相关视频也是可以有多个元素,多个相关视频又用“\t”进行分割。为了分析数据时方便对存在多个子元素的数据进行操作,我们首先进行数据重组清洗操作。即:将所有的类别用“&”分割,同时去掉两边空格,多个相关视频 id 也使用“&”进行分割。
1、ETL 之 ETLUtil
/**
* 1.过滤脏数据
* 2.将类别字段中的空格
* 3.替换关联视频中的分隔符
*/
public class ETLUtil {
public static String etlStr(String line){
//切割数据
String[] split = line.split("\t");
//1. 过滤脏数据
if (split.length<9) return null;
//2. 去掉类别字段中的空格
split[3] = split[3].replaceAll(" ", "");
//3.替换关联视频的分隔符
StringBuffer sb = new StringBuffer();
for (int i=0; i < split.length; i++) {
if (i < 9) {
if (i==split.length - 1){
sb.append(split[i]);
}else {
sb.append(split[i]).append("\t");
}
}else {
if (i==split.length - 1){
sb.append(split[i]);
}else {
sb.append(split[i]).append("&");
}
}
}
return sb.toString();
}
}
2、ETL 之 Mapper
package com.atlxl;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* @author LXL
* @create 2019-06-05 21:26
*/
public class ETlMapper extends Mapper<LongWritable, Text, Text, NullWritable> {
private Text k = new Text();
@Override
protected void map(LongWritable key, Text value, Context context