IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive+MapReduce实现对网站流量数据分析 -> 正文阅读

[大数据]Hive+MapReduce实现对网站流量数据分析

目的: 实现对网站流量数据分析 (MapReduce+Hive综合实验)

文件说明:

http.log 日志文件,是电信运营商记录用户手机上网访问某些网站行为的日志记录数据,其中上行流量+下行流量 = 总流量
phone.txt 是手机号段规则,是手机号码对应地区城市和运营商的数据。

数据部分内容:

http.log 部分数据

.

phone.txt 部分数据
.

数据格式说明:

  • http.log日志 数据格式:
    手机号码,请求网站的URL,上行流量(20字节),下行流量(5000字节)
    例如:18611132889 http://v.baidu.com/tv 20 5000
  • phone.txt 数据格式:
    手机号前缀,手机号段,手机号码对应的省份,城市,运营商,邮编,区号,行政划分代码
    例如:133 1332170 广西 南宁 电信 530000 0771 450100
    (一条数据中多个字段用空格或制表符分隔)

要求:

  • 用 MapReduce 将数据段的间隔改成“,”
  1. 根据给的用户上网日志记录数据,计算出总流量最高的网站Top3(网站例如:v.baidu.com,weibo.com);
  2. 根据给的用户上网日志记录数据,计算出总流量最高的手机号Top3
  3. 根据给的手机号段归属地规则,计算出总流量最高的省份Top3
  4. 根据给的手机号段运营商规则,计算出总流量最高的运营商Top2
  5. 根据给的手机号段归属地规则,计算出总流量最高的城市Top3

首先对数据用 MapReduce 进行简单的处理,流程如下:

http.log 数据处理流程
phone.txt 数据处理流程


处理完数据,得到我们想要的数据,如下:

http.log 处理后的数据

.

phone.txt 处理后的数据


以下是 MapReduce 主要代码。
http_Mapper 代码:

public class http_Mapper extends Mapper<LongWritable, Text, Text, NullWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //用正则表达式将文件每一行的制表符和空格换成逗号
        String new_value = value.toString().replaceAll("[\t ]", ",");

        //将修改后的每一行数据切割成数组
        String[] new_value_split = new_value.split(",");

        //将每一行数据的网站保留有效域名
        String domain_name = new_value_split[1].replaceAll("[a-zA-Z]+://|(/.*)", "");

        //将每一行数据的上下行流量求和
        int all_flow = Integer.parseInt(new_value_split[2]) + Integer.parseInt(new_value_split[3]);

        //将手机号、域名网址、总流量作为处理后的有效数据,例如:15639120688	v.baidu.com 15994
        String k2 = new_value_split[0] + "," + domain_name + "," + all_flow;

        //写入上下文对象
        context.write(new Text(k2), NullWritable.get());
    }
}

http_Reducer 代码:

public class http_Reducer extends Reducer<Text, NullWritable, Text, NullWritable> {
    @Override
    protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
        //将shuffle过来的(k3,v3)直接当(k4,v4)就好了
        context.write(key, NullWritable.get());
    }
}

phone_Mapper 代码:

public class phone_Mapper extends Mapper<LongWritable, Text, Text, NullWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //将文件每一行的制表符换成逗号
        String new_value = value.toString().replace("\t", ",");

        //将修改后的每一行数据切割成数组
        String[] new_value_split = new_value.split(",");

        //将手机号段、省份、城市、运营商作为最后的有效数据,例如:1300000 山东 济南 联通
        String mes = new_value_split[1] + "," + new_value_split[2] + "," + new_value_split[3] + "," + new_value_split[4];

        //写入上下文对象
        context.write(new Text(mes), NullWritable.get());
    }
}

phone_Reducer 代码:

public class phone_Reducer extends Reducer<Text, NullWritable, Text, NullWritable> {
    @Override
    protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
        //将shuffle过来的(k3,v3)直接当(k4,v4)就好了
        context.write(key, NullWritable.get());
    }
}

接下来,创建 Hive 表,
输入命令:

create table if not exists lhr_http
(h_no bigint ,h_url string ,h_allstream int) 
row format delimited fields terminated by ',';

create table if not exists lhr_phone
(p_no bigint ,p_prov string ,p_city string ,p_oper string) 
row format delimited fields terminated by ',';

运行结果:


将清洗后的数据导入Hive
输入命令:

load data inpath '/http_out/part-r-00000' into table lhr_http;
load data inpath '/phone_out/part-r-00000' into table lhr_phone;

运行结果:


导入的的数据:


现在我们已经将处理好的数据导入到创建的两张 Hive 表了,接下来就可以写 Hql 语句来完成前面提到的 5 个要求了。


1.根据给的用户上网日志记录数据,计算出总流量最高的网站Top3(网站例如:v.baidu.com, weibo.com)

输入命令:

select h_url,sum(h_allstream) as sum 
from lhr_http 
group by h_url 
order by sum desc 
limit 3;

输出结果:



2. 根据给的用户上网日志记录数据,计算出总流量最高的手机号Top3

输入命令:

select h_no,sum(h_allstream) as sum 
from lhr_http 
group by h_no 
order by sum desc 
limit 3;

输出结果:



3. 根据给的手机号段归属地规则,计算出总流量最高的省份Top3

输入命令:

select p_prov,sum(h_allstream) as sum 
from lhr_http, lhr_phone 
where substr(h_no,0,7)=p_no 
group by p_prov 
order by sum desc limit 3;

输出结果:



4. 根据给的手机号段运营商规则,计算出总流量最高的运营商Top2

输入命令:

select p_oper,sum(h_allstream) as sum 
from lhr_http,lhr_phone 
where substr(h_no,0,7)=p_no 
group by p_oper 
order by sum desc 
limit 2;

输出结果:



5. 根据给的手机号段归属地规则,计算出总流量最高的城市Top3

输入命令:

select p_city,sum(h_allstream) as sum 
from lhr_http,lhr_phone where substr(h_no,0,7)=p_no 
group by p_city 
order by sum desc 
limit 3;

输出结果:


over!!!

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-04 19:57:25  更:2021-07-04 19:58:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 16:01:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码