0


基于hadoop+MapReduce+Java大数据清洗和分析的基本操作流程

全套资源下载地址: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


本文转载自: https://blog.csdn.net/newlw/article/details/129169683
版权归原作者 biyezuopinvip 所有, 如有侵权,请联系我们删除。

“基于hadoop+MapReduce+Java大数据清洗和分析的基本操作流程”的评论:

还没有评论