有一个诸如这样的log日志

去除长度不合法,并且状态码不正确的记录

LogBean

  1. package com.nty.elt;
  2.  
  3. /**
  4. * author nty
  5. * date time 2018-12-14 15:27
  6. */
  7. public class Log {
  8.  
  9. private String remote_addr;// 记录客户端的ip地址
  10. private String remote_user;// 记录客户端用户名称,忽略属性"-"
  11. private String time_local;// 记录访问时间与时区
  12. private String request;// 记录请求的url与http协议
  13. private String status;// 记录请求状态;成功是200
  14. private String body_bytes_sent;// 记录发送给客户端文件主体内容大小
  15. private String http_referer;// 用来记录从那个页面链接访问过来的
  16. private String http_user_agent;// 记录客户浏览器的相关信息
  17.  
  18. private boolean valid = true;// 判断数据是否合法
  19.  
  20. public String getRemote_addr() {
  21. return remote_addr;
  22. }
  23.  
  24. public Log setRemote_addr(String remote_addr) {
  25. this.remote_addr = remote_addr;
  26. return this;
  27. }
  28.  
  29. public String getRemote_user() {
  30. return remote_user;
  31. }
  32.  
  33. public Log setRemote_user(String remote_user) {
  34. this.remote_user = remote_user;
  35. return this;
  36. }
  37.  
  38. public String getTime_local() {
  39. return time_local;
  40. }
  41.  
  42. public Log setTime_local(String time_local) {
  43. this.time_local = time_local;
  44. return this;
  45. }
  46.  
  47. public String getRequest() {
  48. return request;
  49. }
  50.  
  51. public Log setRequest(String request) {
  52. this.request = request;
  53. return this;
  54. }
  55.  
  56. public String getStatus() {
  57. return status;
  58. }
  59.  
  60. public Log setStatus(String status) {
  61. this.status = status;
  62. return this;
  63. }
  64.  
  65. public String getBody_bytes_sent() {
  66. return body_bytes_sent;
  67. }
  68.  
  69. public Log setBody_bytes_sent(String body_bytes_sent) {
  70. this.body_bytes_sent = body_bytes_sent;
  71. return this;
  72. }
  73.  
  74. public String getHttp_referer() {
  75. return http_referer;
  76. }
  77.  
  78. public Log setHttp_referer(String http_referer) {
  79. this.http_referer = http_referer;
  80. return this;
  81. }
  82.  
  83. public String getHttp_user_agent() {
  84. return http_user_agent;
  85. }
  86.  
  87. public Log setHttp_user_agent(String http_user_agent) {
  88. this.http_user_agent = http_user_agent;
  89. return this;
  90. }
  91.  
  92. public boolean isValid() {
  93. return valid;
  94. }
  95.  
  96. public Log setValid(boolean valid) {
  97. this.valid = valid;
  98. return this;
  99. }
  100.  
  101. @Override
  102. public String toString() {
  103.  
  104. StringBuilder sb = new StringBuilder();
  105. sb.append(this.valid);
  106. sb.append("\001").append(this.remote_addr);
  107. sb.append("\001").append(this.remote_user);
  108. sb.append("\001").append(this.time_local);
  109. sb.append("\001").append(this.request);
  110. sb.append("\001").append(this.status);
  111. sb.append("\001").append(this.body_bytes_sent);
  112. sb.append("\001").append(this.http_referer);
  113. sb.append("\001").append(this.http_user_agent);
  114.  
  115. return sb.toString();
  116. }
  117.  
  118. }

Mapper类

  1. package com.nty.elt;
  2.  
  3. import org.apache.hadoop.io.LongWritable;
  4. import org.apache.hadoop.io.NullWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7.  
  8. import java.io.IOException;
  9.  
  10. /**
  11. * author nty
  12. * date time 2018-12-14 15:28
  13. */
  14. public class LogMapper extends Mapper<LongWritable, Text, Text, NullWritable> {
  15.  
  16. private Text logKey = new Text();
  17.  
  18. @Override
  19. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  20. //分割一行数据
  21. String[] fields = value.toString().split(" ");
  22.  
  23. Log result = parseLog(fields);
  24.  
  25. if (!result.isValid()) {
  26. return;
  27. }
  28.  
  29. logKey.set(result.toString());
  30.  
  31. // 3 输出
  32. context.write(logKey, NullWritable.get());
  33. }
  34.  
  35. private Log parseLog(String[] fields) {
  36.  
  37. Log log = new Log();
  38.  
  39. if (fields.length > 11) {
  40. log.setRemote_addr(fields[0])
  41. .setRemote_user(fields[1])
  42. .setTime_local(fields[3].substring(1))
  43. .setRequest(fields[6])
  44. .setStatus(fields[8])
  45. .setBody_bytes_sent(fields[9])
  46. .setHttp_referer(fields[10]);
  47. if (fields.length > 12) {
  48. log.setHttp_user_agent(fields[11] + " " + fields[12]);
  49. } else {
  50. log.setHttp_user_agent(fields[11]);
  51. }
  52. // 大于400,HTTP错误
  53. if (Integer.parseInt(log.getStatus()) >= 400) {
  54. log.setValid(false);
  55. }
  56. } else {
  57. log.setValid(false);
  58. }
  59.  
  60. return log;
  61. }
  62.  
  63. }

Driver

  1. package com.nty.elt;
  2.  
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.io.NullWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Job;
  8. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  9. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  10.  
  11. /**
  12. * author nty
  13. * date time 2018-12-14 15:40
  14. */
  15. public class LogDriver {
  16.  
  17. public static void main(String[] args) throws Exception {
  18. // 1 获取job信息
  19. Configuration conf = new Configuration();
  20. Job job = Job.getInstance(conf);
  21.  
  22. // 2 加载jar包
  23. job.setJarByClass(LogDriver.class);
  24.  
  25. // 3 关联map
  26. job.setMapperClass(LogMapper.class);
  27.  
  28. // 4 设置最终输出类型
  29. job.setOutputKeyClass(Text.class);
  30. job.setOutputValueClass(NullWritable.class);
  31.  
  32. // 5 设置输入和输出路径
  33. FileInputFormat.setInputPaths(job, new Path("d:\\Hadoop_test"));
  34. FileOutputFormat.setOutputPath(job, new Path("d:\\Hadoop_test_out"));
  35.  
  36. // 6 提交
  37. job.waitForCompletion(true);
  38.  
  39. }
  40. }

结果

Hadoop(21)-数据清洗(ELT)简单版的更多相关文章

  1. 小米抢购(简单版v0.1)-登录并验证抢购权限,以及获取真实抢购地址

    小米(简单版)-登录并验证抢购权限,以及获取真实抢购地址! 并不是复制到浏览器就行了的   还得传递所需要的参数 这里只是前部分  后面的自己发挥了 { "stime": 1389 ...

  2. Hadoop on Mac with IntelliJ IDEA - 10 陆喜恒. Hadoop实战(第2版)6.4.1(Shuffle和排序)Map端 内容整理

    下午对着源码看陆喜恒. Hadoop实战(第2版)6.4.1  (Shuffle和排序)Map端,发现与Hadoop 1.2.1的源码有些出入.下面作个简单的记录,方便起见,引用自书本的语句都用斜体表 ...

  3. Hadoop介绍及最新稳定版Hadoop 2.4.1下载地址及单节点安装

     Hadoop介绍 Hadoop是一个能对大量数据进行分布式处理的软件框架.其基本的组成包括hdfs分布式文件系统和可以运行在hdfs文件系统上的MapReduce编程模型,以及基于hdfs和MapR ...

  4. JavaMail简单版实验测试

    前言: 最近由于实现web商城的自动发送邮件功能的需求,故涉猎的邮箱协议的内部原理.现将简单版的Java Mail实例做个代码展示,并附上其中可能出现的bug贴出,方便感兴趣的读者进行测试! 1.载入 ...

  5. Java实现简单版SVM

    Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的.         之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...

  6. MySQL数据库执行计划(简单版)

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库执行计划简单版时间:2019年2月25日内容:MySQL数据库执行计划简单版重点:MySQL ...

  7. 红警大战JAVA简单版

    代码结构: 相关源码: 武器类: 属性:武器,攻击力,子弹数量. 方法:给属性赋值(set属性()方法) 获取属性值(get属性()方法) package 红警大战简单版; public class ...

  8. TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇

    TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...

  9. 模板】AC自动机(简单版)

    模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...

随机推荐

  1. java面试题之----spring与struts2的比较

    我们从以下几个维度来区分两者的概念: 1.  机制:spring mvc的入口是servlet,而struts2是filter.     补充几点知识:     < Filter 实现javax ...

  2. nginx下的nagios pnp4nagios

    #Spawn-FCGI 一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作 #fcgiwrap(Si ...

  3. (原创)攻击方式学习之(3) - 缓冲区溢出(Buffer Overflow)

    堆栈溢出 堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的.了解堆栈溢出之前,先了解以下几个概念: 缓冲区 简单说来是一块连续的计算机内存区域,可以保存相同数据类型的多个实例. 堆栈     堆 栈是 ...

  4. 在centos7中安装redis,并通过node.js操作redis

    引言 最近在学习node.js 连接redis的模块,所以尝试了一下在虚拟机中安装cent OS7,并安装redis,并使用node.js 操作redis.所以顺便做个笔记. 如有不对的地方,欢迎大家 ...

  5. 最简单的docker教程:在docker里运行nginx服务器

    命令行docker search nginx搜索名为nginx的docker image,返回结果的第一个,github上有10293个star,这就是我们想要搜索的结果: 使用命令docker pu ...

  6. http中COOKIE和SESSION有什么区别?(转知乎)

    作者:知乎用户链接:https://www.zhihu.com/question/19786827/answer/28752144来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  7. 计算次数,POJ(1207)

    题目链接:http://poj.org/problem?id=1207 #include <stdio.h> #include <algorithm> using namesp ...

  8. [USACO17JAN]Subsequence Reversal

    嘟嘟嘟 这题刚开始是什么思路也没有,关键是不知道怎么解决序列反转的问题. 然后我就想到如果暴力反转一个序列的话,实际上就是不断交换数组中的两个数ai和aj,同时要满足交换的数不能交叉. 然后又看了一眼 ...

  9. Hashtable详细介绍(源码解析)和使用示例

    第1部分 Hashtable介绍 Hashtable 简介 和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射. Hashtable 继承于Dic ...

  10. genil层

    genil 层将底层的业务逻辑封装成一个接口(例如 get_dynamic_result这种),供ui层调用(ui点击 search dynamic result按钮,会调用 get_dynamic_ ...