前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hadoop实战_hadoop 项目实战

Hadoop实战_hadoop 项目实战

作者头像
全栈程序员站长
发布2022-11-15 15:22:34
2.3K1
发布2022-11-15 15:22:34
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

hadoop 实战练习(二)

引言: 哈哈,时隔几日,坏蛋哥又回来了,继上一篇hadoop实战练习(一),坏蛋哥准备继续写一个实战练习实例。苏格拉底曾说:所有科学都源于需求。那么我们就抛出今天实战项目的需求:百度采集了一段时间用户的访问日志。需要将数据进行清洗变成结构化的数据,方便后面模型或报表的制作。那么就让我们开始吧!

码字不易,如果大家想持续获得大数据相关内容,请关注和点赞坏蛋哥(haha…)

文章目录:

文章目录

一 项目需求分析

百度采集了用户点击访问的日志(后台回复【baidu】可获得实验数据哦!),现在需要分析日志数据。进行一个轻量级的数据汇总,数据形式如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如图所示,在日志文件中有后台数据的埋点日志(也就类似于System.out.println(“某某怎们样了,我记录一下”))和下面我圈出来的,用户访问url所打印的信息。现在要就将统计同一个ip地址访问了几次页面,并统计最开始访问和最后访问的页面是什么。最后的结果类似于:

在这里插入图片描述
在这里插入图片描述

二 项目实现思路

如果你已经有思路了或者想要尝试一下自己来完成这个小项目,那么就请暂时退出网页,试着自己独立完成,如果中途有什么不懂的,可以上网查取资料。完成后再来看我的思路。如果你对hadoop还不是很熟悉,那么可以先看下我的思路,如果理解了,那么就请自己一个人来独立复现代码哦(相信坏蛋哥这么做是为你好,什么东西都是当你能随心所欲的用于起来了,那么就代表你学会了)。

这个项目主要要写map和reduce函数,map函数主要要实现数据的清洗和提取,这儿主要涉及到的是正则表达式的知识。map将数据变成以ip为键,time和page为value。reduce函数实现对数据的统计,算出timecount和pagecount并比较得出startpage和lastpage。

三 具体实现代码讲解

3.1 map函数代码的具体讲解:

代码语言:javascript
复制
/** * function:用于log文件的map,输入是ip,date,pageurl * */
public class FlashMapper extends Mapper<LongWritable,Text,Text,Text> { 

@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 

String line=value.toString();
String ipResult= null;
String timeResult=null;
String pageResult=null;
String regex="(\\d{1,3}\\.){3}\\d{1,3}";
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher(line);
//ip发现
if (matcher.find()){ 

ipResult=matcher.group();
System.out.println("###########获取到的ip为##############:"+ipResult);
String regexTime="\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
Pattern pattern1=Pattern.compile(regexTime);
Matcher matcher1=pattern1.matcher(line);
//时间发现
if (matcher1.find()){ 

timeResult=matcher1.group();
}
String regexPage="http://.*]";
Pattern pattern2=Pattern.compile(regexPage);
Matcher matcher2=pattern2.matcher(line);
//发现页面
if(matcher2.find()){ 

pageResult=matcher2.group(0);
pageResult=pageResult.substring(0,pageResult.length()-1);
}
//将清洗的结果传给下一级
context.write(new Text(ipResult),new Text(timeResult+"\t"+pageResult));
}
}
}

3.2 reduce函数的具体讲解:

代码语言:javascript
复制
public class FlashReducer extends Reducer<Text,Text,Text,Text> { 

@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 

//定义格式
DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //注意大小写MM和HH需要区分,其他均为小写
//定义时间
Date startTime= null;
Date lastTime=null;
//时间的字符串格式
String sTime=null;
String lTime=null;
try { 

startTime = format.parse("2030-12-12 12:12:12");//初始取最大
lastTime=format.parse("1000-10-10 00:00:00");  //初始取最小
} catch (ParseException e) { 

e.printStackTrace();
}
//定义次数和间隔时间
Long count=0l;
Long distance=0l;
//定义网页url
String startPage=null;
String lastPage=null;
String temp=null;
for (Text text:values){ 

//计数
count=count+1;
temp=text.toString();
String as[]=temp.split("\t");
//获取时间和页面
String time=as[0];
String page=as[1];
//将String转化为Date类
Date getTime=null;
try { 

getTime=format.parse(time);
} catch (ParseException e) { 

e.printStackTrace();
}
//判断是否是最早或最晚
if (startTime.after(getTime)){ 

startTime=getTime;
startPage=page;
}
if(lastTime.before(getTime)){ 

lastTime=getTime;
lastPage=page;
}
}
//就间隔时间(单位:分钟)
Calendar startCalendar=Calendar.getInstance();
Calendar lastCalendar=Calendar.getInstance();
startCalendar.setTime(startTime);
lastCalendar.setTime(lastTime);
//利用calendar计算间隔
distance=(lastTime.getTime()-startTime.getTime())/(1000);  //以秒为单位
//将时间格式化
sTime=format.format(startTime);
lTime=format.format(lastTime);
//打印一下结果
System.out.println(key+" "+sTime+" "+startPage+" "+
lTime+" "+lastPage+" "+distance);
//写入数据
context.write(new Text(key),
new Text(sTime+"\t"+startPage+"\t"+
lTime+"\t"+lastPage+"\t"+distance+"\t"+count));
}
}

四 总结

上面的全部代码可以在后台回复【hadoop练习1】获取github链接,如果能帮到你,希望给坏蛋哥点赞和收藏哦,你的肯定才是坏蛋哥把这个公众号做好的动力,后面我会讲解如何用spark来清晰日志,hive+tez建立电商数仓,flume+kafka的数据收集等相关实战和深入理论。码字不容易,欢迎关注坏蛋哥哦!

参考文献:

  • Hadoop documention

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234322.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月2日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • hadoop 实战练习(二)
    • 文章目录
      • 一 项目需求分析
        • 二 项目实现思路
          • 三 具体实现代码讲解
            • 3.1 map函数代码的具体讲解:
            • 3.2 reduce函数的具体讲解:
          • 四 总结
          相关产品与服务
          腾讯云 BI
          腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档