全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734 全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734

数据处理

1.概述

1.数据抓取 a.进行地址库建设:爬虫 + 人工 (行为匹配数据) b.电信每天用户访问的网址信息,大约产生 2TB;(原始数据) 2.数据清洗 3.数据匹配 4.数据分析

2.包名及作用

2.1 com.jida.hadoop.mr.wz.dataclean

数据清洗

(1) 加载基础数据 (2) 判断数据字段是否一致 (3) 判断 url 是否为空 (4) 判断 url 是否只包含 http://或 https:// (5) 提取域名

输出内容:用户标识 | 一级域名 |URL 地址

本次实验中数据清洗的目的是通过 map 处理,将不符合规范、特殊格式(配置文件、图片等)数据过滤掉。 不符合规范的 url 过滤方法:

部分代码

// 判断数据字段数量,判断url字段是否有效,去除特定格式

if ((str.length + "").equals(TProperties.getValue("filelength"))

&& !"http://".equals(str[14])

&& !"https://".equals(str[14])

&& !"".equals(str[14])

&& !(str[14].toLowerCase()).matches(TProperties.getValue("fileclear"))) {

StringBuffer sb = new StringBuffer();

if (!str[14].startsWith("http://") && !str[14].startsWith("https://")) {

str[14] = "http://" + str[14];

}

}

特殊格式过滤方法:

使用正则表达式过滤带有.jpg、.png、.bmp 等子串,且子串之后无字符(即子串在结尾或后跟特殊符号)的 url

.*\\.(jpg|png|bmp|jpeg|tif|gif|psd|ico|pdf|css|tmp|js|gz|rar|gzip|zip|txt|csv|xlsx|xls|webp)(\\W.*|$)

获取域名方法:

//正则判断域名或ip地址

public static String getDomain(String domain){

//判断IP

String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";

if(domain.matches(ip)){

return domain;

}

//判断域名

String str= "((\\w*|\\w*-\\w*)\\.?\\.(com.cn|net.cn|gov.cn|org\\.nz|org.cn|com|net|org|gov|cc|biz|info|cn|hk|in|am|im|fm|tv|co|me|us|io|mobi|pw|so|gs|top|la))$";

Pattern pattern = Pattern.compile(str);

Matcher matcher = pattern.matcher(domain);

while(matcher.find()){

return matcher.group();

}

return "";

}

// 获取域名

String domain = str[14].split("/", -1)[2];

// 去除端口

if (domain.indexOf(":") >= 0) {

domain = domain.split("\\:", -1)[0];

}

TMatcher.getDomain(domain)

(2) 地址库配置数据文件读取与使用 使用 job.addCacheFile()方法,将地址库配置数据文件送入 job 的缓存区,在 mapper 中创建 setup 函数,setup 函数在 map 之前执行,用于加载地址库。

//将地址库配置数据文件送入job的缓存区

job.addCacheFile(new Path("file:///D://testdata/dx/t_dx_basic_msg_addr.txt").toUri());

setup中使用BufferReader类读取文件并写入内存,数据结构采用Map<一级域名, TreeMap>,用treemap按优先级排序,创建StringComparator工具类,修改treemap的排序方式。map端循环匹配数据,输出行为id,用户号码,是否产品,url,预购类型。

//重写setup方法

@Override

protected void setup( Mapper.Context context) throws IOException, InterruptedException {

// 预处理把要关联的文件加载到缓存中

// 我们这里只缓存了一个文件,所以取第一个即可,创建BufferReader去读取

Path file = new Path(context.getCacheFiles()[0].getPath());

BufferedReader reader = new BufferedReader(new FileReader(file.toString()));

String str = null;

try {

// 一行一行读取

while ((str = reader.readLine()) != null) {

// 对缓存中的表进行分割

String[] splits = str.split(TProperties.getValue("fileoutsplit"));

//map是否包含一级域名

if (joinData.containsKey(splits[1])) {

//增加treemap中url值:匹配地址,匹配级别,行为ID,产品标识,预购类型

joinData.get(splits[1]).put(splits[2] + "," + splits[3] + "," + splits[0] +","+ splits[4]+ "," + splits[5], "");

} else {

//创建map中key值,添加treemap,StringComparator修改treemap排序方式

TreeMap treemap = new TreeMap( new StringComparator());

//url地址,匹配级别,行为ID,是否产品,预购类型

treemap.put(splits[2] + "," + splits[3]+ "," + splits[0] +","+ splits[4] + "," + splits[5], "");

//key一级域名

joinData.put(splits[1], treemap);

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

reader.close();

}

}

(3)第三、四步统计 PV、UV 总数

(4)第五步中排序 value 因为 mapreduce 按照 key 值排序,而 key 值需为用户标识,因此对 PV 的排序不能直接使用 mapreduce 内置函数,利用 Java Treemap 类,将 PV 作为红黑树的 key 值,行为标识和 PV 值作为 value 排序,并在最终输出结果中增加一列排名序列。

//reduce排序取值

public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {

TreeMap topMap = new TreeMap();

//循环数据

for (Text val : values) {

String[] str = val.toString().split(TProperties.getValue("fileoutsplit"));

//将数据放入数据集合

topMap.put(Integer.parseInt(str[topvalue]), val.toString());

//移除超过取值条数的较小数据

if(topMap.size() > topn){

topMap.remove(topMap.firstKey());

}

}

int num = 0;

Iterator iterator = topMap.keySet().iterator();

//数据转换,计算排名

List list = new ArrayList();

while (iterator.hasNext()) {

list.add(topMap.get(iterator.next()));

}

//取数据条数+1,用于计算排名

num = list.size() + 1 ;

for(int i = 0 ;i< list.size() ; i++){

//排名

num = num -1 ;

//行为ID,用户ID,PV(访问次数),排名

result = new Text(list.get(i) + TProperties.getValue("outfilesplit") + num );

context.write(NullWritable.get(), result);

}

}

2.2 com.jida.hadoop.mr.wz.basicmatch

行为匹配

行为地址基础数据 t_dx_basic_msg_addr.txt

处理要求: (1) 关联行为地址库(t_dx_basic_msg_addr.txt)识别用户访问行为 (2) 将“任务 1 数据清洗”之后的结果数据与行为地址基础库做 map-join 操作 利用 DistributedCache(分布式缓存)将小文件(地址库)缓存处理

输入内容:用户标识 | 一级域名 |URL 地址 输出内容:行为 id| 用户标识 | 是否产品 |url| 预购类型

2.3 com.jida.hadoop.mr.wz.countpv

用户行为统计

(PV:页面的访问量,UV:独立“用户”访问量)

处理要求: (1)根据“任务 2 行为匹配”的结果数据统计用户的行为地址访问次数 (2)输出数据:行为 ID,用户标识,PV 数 行为 ID 的构成 18 位:其中前六位标识一级域名; 中间六位标识二级域名;最后六位标识三级域名; (3)电信行为数据统计将计算一级域名的 PV 数,故将二级域名和三级域名的行为数据均转化为一级域名,求 PV 值

输入数据:行为 id| 用户标识 | 是否产品 |url| 预购类型 输出数据:行为 ID| 用户标识 |PV 数

2.4 com.jida.hadoop.mr.wz.countuv

网站访问行为统计

(PV:页面的访问量,UV:独立“用户”访问量)

处理要求: (1)根据用户行为统计的结果统计 URL 的 UV 数(用户数)和 PV 数(访问数)

输入数据:行为 ID| 用户标识 |PV 数 输出数据:行为 ID|UV 数(用户数)|PV 数(访问数)

2.5 com.jida.hadoop.mr.wz.counttopn

网站访问行为 TopN

处理要求: 提取用户的高频地址

输入数据:行为 ID| 用户标识 |PV 数 输出数据:行为 ID| 用户标识 |PV(访问次数)| 排序字段

3.通过本项目你学到了哪些内容

(1)MapReduce 基本操作 源代码编写、Java 基本语法。

(2)重写 mapper 中的 setup 方法,实现数据从 job 缓存中的调用读取。

(3)对于大数据清洗和分析的基本操作流程 清洗不符合规范的数据以及不需要采用的特殊数据、通过字典简化数据格式(如实验第二步中用到的行为地址基础数据)、分析数据中对于生产或研究有意义的数据(如实验第五步获取的用户行为 topn)。

4.其他你认为需要总结的

MapReduce 是面向大数据并行处理的计算模型、框架和平台。它利用"Map(映射)“和"Reduce(归约)”,将程序运行在分布式系统中,通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性。 这次实验利用本机 hadoop 环境完成实验内容操作,之后我会结合在大数据存储系统这门课上所学的知识,尝试在虚拟机环境中运行程序,真正理解和掌握 MapReduce。 作为云计算与大数据方向的学生,学习 hadoop 中的 mapreduce 框架操作是必不可少的,目前我的 Java 基础还比较薄弱,在实验过程中遇到了许多问题,今后会在课余时间多加练习,为毕业设计的进行打好基础。

附录 图片

图 1

图 2

图 3

图 4

图 5 全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734 全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: