package mapreduce.webpv;

 import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class WebPvMapReduce extends Configured implements Tool { // step 1: Mapper
public static class WebPvMapper extends
Mapper<LongWritable, Text, IntWritable, IntWritable> {
private IntWritable mapOutputKey = new IntWritable();
private IntWritable mapOutputValue = new IntWritable(1); @Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException { // line value
String lineValue = value.toString(); // spilt
String[] values = lineValue.split("\t"); // url
String urlValue = values[1]; if (StringUtils.isBlank(urlValue)) {
// conuter
context.getCounter("WEBPVMAPPER_CUUNTERS", "URL_BLANK")
.increment(1L);
return;
} if (30 > values.length) { // conuter
context.getCounter("WEBPVMAPPER_CUUNTERS", "LENGTH_LT_30")
.increment(1L); return;
} // province id
String provinceIdValue = values[23]; if (StringUtils.isBlank(provinceIdValue)) {
// conuter
context.getCounter("WEBPVMAPPER_CUUNTERS", "PROVINCEID_BLANK")
.increment(1L);
return;
} Integer provinceId = Integer.MAX_VALUE;
try {
provinceId = Integer.valueOf(provinceIdValue);
} catch (Exception e) {
// conuter
context.getCounter("WEBPVMAPPER_CUUNTERS",
"PROVINCEID_NOT_NUMBER").increment(1L);
return;
} // map outpu key
mapOutputKey.set(provinceId); context.write(mapOutputKey, mapOutputValue);
}
} // step 2: Reducer
public static class WebPvReducer extends
Reducer<IntWritable, IntWritable, IntWritable, IntWritable> {
private IntWritable outputValue = new IntWritable(); @Override
protected void reduce(IntWritable key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
// temp sum
int sum = 0; // iterator
for (IntWritable value : values) {
sum += value.get();
} // set output
outputValue.set(sum); context.write(key, outputValue);
}
} // step 3: Driver
public int run(String[] args) throws Exception { Configuration configuration = this.getConf(); Job job = Job.getInstance(configuration, this.getClass()
.getSimpleName());
job.setJarByClass(WebPvMapReduce.class); // set job
// input
Path inpath = new Path(args[0]);
FileInputFormat.addInputPath(job, inpath); // output
Path outPath = new Path(args[1]);
FileOutputFormat.setOutputPath(job, outPath); // Mapper
job.setMapperClass(WebPvMapper.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(IntWritable.class); // Reducer
job.setReducerClass(WebPvReducer.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(IntWritable.class); // submit job -> YARN
boolean isSuccess = job.waitForCompletion(true);
return isSuccess ? 0 : 1;
} public static void main(String[] args) throws Exception { Configuration configuration = new Configuration(); args = new String[] {
"hdfs://beifeng01:8020//user/beifeng01/mapreduce/input/testdata/2015082818",
"hdfs://beifeng01:8020//user/beifeng01/mapreduce/output1" }; int status = ToolRunner.run(configuration, new WebPvMapReduce(), args); // exit program
System.exit(status);
}
}

查看结果

 $ bin/hdfs dfs -text /user/beifeng01/mapreduce/output1/pa*
1 3527
2 1672
3 511
4 325
5 776
6 661
7 95
8 80
9 183
10 93
11 135
12 289
13 264
14 374
15 163
16 419
17 306
18 272
19 226
20 2861
21 124
22 38
23 96
24 100
25 20
26 157
27 49
28 21
29 85
30 42
32 173

MapReduce清洗日志数据统计PV量的更多相关文章

  1. 利用mapreduce清洗日志内存不足问题

    package com.libc; import java.io.IOException; import java.io.UnsupportedEncodingException; import ja ...

  2. nginx日志分析及其统计PV、UV、IP

    一.nginx日志结构 nginx中access.log 的日志结构: $remote_addr 客户端地址 211.28.65.253 $remote_user 客户端用户名称 -- $time_l ...

  3. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 数据统计(Ⅳ)

    上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页快捷方式>,主要介绍通过添加首页快捷方式,快速进入各个应用菜单功能. 将常用的菜单功能作为快捷方式,避免由于寻找诸多 ...

  4. Git 常用命令和统计代码量

    摘要 分享Git日常操作中常用的命令,分享如何统计在项目中贡献的代码量. 下面列出Git bash常用命令. 1. git clone **(项目地址) 克隆一个git项目到本地,将git项目拉取到本 ...

  5. 使用mapreduce对日志进行清洗

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:当前页面 网站日志分析项目案例 ...

  6. 有关“数据统计”的一些概念 -- PV UV VV IP跳出率等

    有关"数据统计"的一些概念 -- PV UV VV IP跳出率等 版权声明:本文为博主原创文章,未经博主允许不得转载. 此文是本人工作中碰到的,随时记下来的零散概念,特此整理一下. ...

  7. 视频网站数据MapReduce清洗及Hive数据分析

    一.需求描述 利用MapReduce清洗视频网站的原数据,用Hive统计出各种TopN常规指标: 视频观看数 Top10 视频类别热度 Top10 视频观看数 Top20 所属类别包含这 Top20 ...

  8. 登录日志的访问日志的 统计 MapReduce

    登录日志的访问日志的 统计    MapReduce <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-commo ...

  9. mapreduce清洗数据

    继上篇 MapReduce清洗数据 package mapreduce; import java.io.IOException; import org.apache.hadoop.conf.Confi ...

随机推荐

  1. 测试mysql性能工具

    mysqlslap mysqlslap可以模拟服务器的负载,并输出计时信息.它包含在MySQL 5.1 的发行包中,应该在MySQL 4.1或者更新的版本中都可以使用.测试时可以执行并发连接数,并指定 ...

  2. docker images存放路径指定

    steps: 1. mkdir /home/docker(你想要docker存放image的目录) 2. systemctl stop docker 3. vi /usr/lib/systemd/sy ...

  3. [EffectiveC++]item35:考虑virtual函数以外的其他选择

    本质上是说了:   Template Pattern & Strategy Pattern 详细见<C++设计模式 23种设计模式.pdf 55页> 宁可要组合 不要继承. ——— ...

  4. [EffectiveC++]item34:区分接口继承和实现继承

    [EffectiveC++]item34:区分接口继承和实现继承

  5. commons.pool2 对象池的使用

    commons.pool2 对象池的使用 ? 1 2 3 4 5 <dependency>     <groupId>org.apache.commons</groupI ...

  6. Powershell split file

    #网上所得非原创 function split($inFile, $outPrefix, [Int32] $bufSize){ $stream = [System.IO.File]::OpenRead ...

  7. Jmeter关于数据库的测试(mysql数据库)

    建立jdbc链接:创建JDBC Connection Configuration. 添加——配置元件——JDBC Connection configuration: 配置JDBC Connection ...

  8. 二十、在Intellij IDEA中使用Debug

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...

  9. 分别利用(代码,Xib,SB)创建空的App工程

    1. 利用代码: 2.利用XIB: 3.利用Storyboard: Xcode 7默认该方式创建项目工程,就不必多说了!

  10. 第27章 LTDC/DMA2D—液晶显示

    本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板 ...