[关闭]
@awsekfozc 2015-11-20T21:59:03.000000Z 字数 2967 阅读 2561

网站基本指标(PV,UV,VV,IP)

PV,UV,VV,IP

PV(page view页面浏览量)

PV介绍

  • 浏览次数(PV):即通常说的PV(PageView)值,用户每打开1个网站页面,记录1个PV。用户多次打开同一页面PV累计多次。用以衡量网站用户访问的网页数量。

PV Mapreduce(以下记录每个省的PV量)

需求分析

 1. 每行都有一个省ID的属性。
 2. 对相同属性的省ID统计到一个组中
 3. 对可能不完整的数据筛选(属性数量必须大约30,省ID不能为空,访问路径不能为空,省ID必须是正确的值(整型))
 4. 对每个组的数累加,获取每个省的访问数量。

代码

  1. /**
  2. * map
  3. * WEBPVMAP_COUNTER 自定义计数器
  4. */
  5. public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {
  6. String linstring = value.toString();
  7. String[] strs = linstring.split("\t");
  8. //属性数量必须大于30
  9. if(strs.length < 30){
  10. context.getCounter("WEBPVMAP_COUNTER","STRSLENGHT_LT30_COUNTERS").increment(1l);
  11. return;
  12. }
  13. String provinceidStr = strs[23];
  14. String url = strs[1];
  15. //省值不能为空
  16. if(StringUtils.isBlank(provinceidStr)){
  17. context.getCounter("WEBPVMAP_COUNTER","PROVINCEIDSTR_NULL_COUNTERS").increment(1l);
  18. return;
  19. }
  20. //访问路径不能为空
  21. if(StringUtils.isBlank(url)){
  22. context.getCounter("WEBPVMAP_COUNTER","URL_NULL_COUNTERS").increment(1l);
  23. return;
  24. }
  25. int provinceid = Integer.MAX_VALUE;
  26. try {
  27. provinceid = Integer.valueOf(provinceidStr);
  28. } catch (Exception e) {
  29. context.getCounter("WEBPVMAP_COUNTER","CHANGE_EXCEPETION_COUNTERS").increment(1l);
  30. return;
  31. }
  32. //省值必须被正确的赋值
  33. if(provinceid == Integer.MAX_VALUE){
  34. context.getCounter("WEBPVMAP_COUNTER","PROVINCEID_CE_COUNTERS").increment(1l);
  35. return;
  36. }
  37. mapoutputkey.set(provinceid);
  38. context.write(mapoutputkey, mapoutputvalue);
  39. }

自定义计数器

自定义计数器.png-5.7kB

  1. /**
  2. * reduce
  3. */
  4. public void reduce(IntWritable key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
  5. int showsum = 0;
  6. for (IntWritable value : values) {
  7. showsum += value.get();
  8. }
  9. outputvalue.set(showsum);
  10. context.write(key, outputvalue);
  11. }

UV(独立用户访问量)

UV介绍

  • 独立访客(UV):1天内相同访客多次访问网站,只计算为1个独立访客。

VV(用户访问量)

VV介绍

  • 来访次数/访问次数(VV):VV = VisitView(访问次数):记录所有访客1天内访问了多少次你的网站,相同的访客有可能多次访问您的网站。从访客来到您网站到最终关闭网站的所有页面离开,计为1次访问。若访客连续30分钟没有新开和刷新页面,或者访客关闭了浏览器,则被计算为本次访问结束。

IP(IP访问量)

VV介绍

  • 1天内不同IP计算一次

PV,UV实现

需求分析

  1. 去除重复的Cookie
  2. 去除重复的IP

代码(PV,UV)

  1. /**
  2. * map
  3. */
  4. protected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {
  5. String[] split = value.toString().split("\\s");
  6. int length = split.length;
  7. //统计数组长度 不够 36的
  8. if (length < 36) {
  9. context.getCounter(VisitMistake.LENGTH_LT_36).increment(1);
  10. return;
  11. }
  12. //统计URL为空的
  13. if (StringUtils.isBlank(split[1])) {
  14. context.getCounter(VisitMistake.URL_IS_NULL).increment(1);
  15. return;
  16. }
  17. // 获取当前登录的用户Id
  18. String guid = split[5];
  19. if (StringUtils.isBlank(guid)) {
  20. context.getCounter(VisitMistake.GUID_IS_NULL).increment(1);
  21. return;
  22. }
  23. //将当前用户加入到UV中进行统计
  24. context.write(TEXT_UV, new Text(guid));
  25. String ip = split[13];
  26. if (StringUtils.isBlank(guid)) {
  27. context.getCounter(VisitMistake.IP_IS_NULL).increment(1);
  28. return;
  29. }
  30. //将当前IP加入到IP中统计
  31. context.write(TEXT_IP, new Text(ip));
  32. }
  1. /**
  2. * reduce
  3. */
  4. public void reduce(Text key, Iterable<Text> iterable, Context context)throws IOException, InterruptedException {
  5. Set<String> sets = new HashSet<String>();
  6. //加入Set中去除重复的数据
  7. for (Text writable : iterable) {
  8. sets.add(writable.toString());
  9. }
  10. context.write(key, new LongWritable(sets.size()));
  11. }

枚举计数器

  1. /**
  2. * 计数器(枚举)
  3. */
  4. package com.zc.hadoop.hdfs.enums;
  5. public enum VisitMistake {
  6. URL_IS_NULL , PROVINCE_ID_IS_NULL , LENGTH_LT_36 ,
  7. PROVINCE_ID_ERROR
  8. , GUID_IS_NULL , IP_IS_NULL
  9. }

在此输入正文

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注