大数据技术之_08_Hive学习_05_Hive实战之谷粒影音(ETL+TopN)+常见错误及解决方案

本文介绍了使用Hive进行谷粒影音数据的ETL过程和业务分析,包括视频观看数Top10、视频类别热度Top10等TopN指标的统计方法,并列举了在Hive操作中遇到的常见错误及其解决方案。
摘要由CSDN通过智能技术生成

第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;
import org.apache.hadoop.io.LongWritable;
import
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值