大数据培训课程数据清洗案例实操-复杂解析版

发布时间:2020年09月23日作者:atguigu浏览次数:513

数据清洗案例实操-复杂解析版

1.需求

对Web访问日志中的各字段识别切分,去除日志中不合法的记录。根据清洗规则,输出过滤后的数据。

(1)输入数据

web.log

(2)期望输出数据

都是合法的数据

2.实现代码

(1)定义一个bean,用来记录日志数据中的各数据字段

package com.atguigu.mapreduce.log;   public class LogBean {   private String remote_addr;// 记录客户端的ip地址   private String remote_user;// 记录客户端用户名称,忽略属性”-”   private String time_local;// 记录访问时间与时区   private String request;// 记录请求的url与http协议   private String status;// 记录请求状态;成功是200   private String body_bytes_sent;// 记录发送给客户端文件主体内容大小   private String http_referer;// 用来记录从那个页面链接访问过来的   private String http_user_agent;// 记录客户浏览器的相关信息     private boolean valid = true;// 判断数据是否合法     public String getRemote_addr() {       return remote_addr;   }     public void setRemote_addr(String remote_addr) {       this.remote_addr = remote_addr;   }     public String getRemote_user() {       return remote_user;   }     public void setRemote_user(String remote_user) {       this.remote_user = remote_user;   }     public String getTime_local() {       return time_local;   }     public void setTime_local(String time_local) {       this.time_local = time_local;   }     public String getRequest() {       return request;   }     public void setRequest(String request) {       this.request = request;   }     public String getStatus() {       return status;   }     public void setStatus(String status) {       this.status = status;   }     public String getBody_bytes_sent() {       return body_bytes_sent;   }     public void setBody_bytes_sent(String body_bytes_sent) {       this.body_bytes_sent = body_bytes_sent;   }     public String getHttp_referer() {       return http_referer;   }     public void setHttp_referer(String http_referer) {       this.http_referer = http_referer;   }     public String getHttp_user_agent() {       return http_user_agent;   }     public void setHttp_user_agent(String http_user_agent) {       this.http_user_agent = http_user_agent;   }     public boolean isValid() {       return valid;   }     public void setValid(boolean valid) {       this.valid = valid;   }     @Override   public String toString() {         StringBuilder sb = new StringBuilder();       sb.append(this.valid);       sb.append(“\001”).append(this.remote_addr);       sb.append(“\001”).append(this.remote_user);       sb.append(“\001”).append(this.time_local);       sb.append(“\001”).append(this.request);       sb.append(“\001”).append(this.status);       sb.append(“\001”).append(this.body_bytes_sent);       sb.append(“\001”).append(this.http_referer);       sb.append(“\001”).append(this.http_user_agent);             return sb.toString();   } }
大数据培训课程

(2)编写LogMapper类

package com.atguigu.mapreduce.log; import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;   public class LogMapper extends Mapper<LongWritable, Text, Text, NullWritable>{   Text k = new Text();     @Override   protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {         // 1 获取1行       String line = value.toString();             // 2 解析日志是否合法       LogBean bean = parseLog(line);             if (!bean.isValid()) {          return;       }             k.set(bean.toString());             // 3 输出       context.write(k, NullWritable.get());   }     // 解析日志   private LogBean parseLog(String line) {         LogBean logBean = new LogBean();             // 1 截取       String[] fields = line.split(” “);             if (fields.length > 11) {            // 2封装数据          logBean.setRemote_addr(fields[0]);          logBean.setRemote_user(fields[1]);          logBean.setTime_local(fields[3].substring(1));          logBean.setRequest(fields[6]);          logBean.setStatus(fields[8]);          logBean.setBody_bytes_sent(fields[9]);          logBean.setHttp_referer(fields[10]);                   if (fields.length > 12) {             logBean.setHttp_user_agent(fields[11] + ” “+ fields[12]);          }else {             logBean.setHttp_user_agent(fields[11]);          }                   // 大于400,HTTP错误          if (Integer.parseInt(logBean.getStatus()) >= 400) {             logBean.setValid(false);          }       }else {          logBean.setValid(false);       }             return logBean;   } }
大数据培训课程

(3)编写LogDriver类

package com.atguigu.mapreduce.log; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;   public class LogDriver {   public static void main(String[] args) throws Exception {       // 1 获取job信息       Configuration conf = new Configuration();       Job job = Job.getInstance(conf);         // 2 加载jar包       job.setJarByClass(LogDriver.class);         // 3 关联map       job.setMapperClass(LogMapper.class);         // 4 设置最终输出类型       job.setOutputKeyClass(Text.class);       job.setOutputValueClass(NullWritable.class);         // 5 设置输入和输出路径       FileInputFormat.setInputPaths(job, new Path(args[0]));       FileOutputFormat.setOutputPath(job, new Path(args[1]));         // 6 提交       job.waitForCompletion(true);   } }
大数据培训课程

想要了解跟多关于大数据培训课程内容欢迎关注尚硅谷大数据培训,尚硅谷除了这些技术文章外还有免费的高质量大数据培训课程视频供广大学员下载学习


上一篇:
下一篇:
相关课程

java培训 大数据培训 前端培训 UI/UE设计培训

关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
全国统一咨询电话:010-56253825
地址:北京市昌平区宏福科技园2号楼3层(北京校区)

深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦6层(上海校区)

武汉市东湖高新开发区东湖网谷(武汉校区)

西安市雁塔区和发智能大厦B座3层(西安校区)