全套资源下载地址: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<url拼接字符串, 空>>,用treemap按优先级排序,创建StringComparator工具类,修改treemap的排序方式。map端循环匹配数据,输出行为id,用户号码,是否产品,url,预购类型。
//重写setup方法
@Override
protected void setup( Mapper<LongWritable, Text, NullWritable, Text>.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<String, String> treemap = new TreeMap<String, String>( 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<Text> values, Context context) throws IOException, InterruptedException {
TreeMap<Integer, String> topMap = new TreeMap<Integer, String>();
//循环数据
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<Integer> iterator = topMap.keySet().iterator();
//数据转换,计算排名
List<String> list = new ArrayList<String>();
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
版权归原作者 biyezuopinvip 所有, 如有侵权,请联系我们删除。