@awsekfozc
2015-11-20T21:59:03.000000Z
字数 2967
阅读 2848
PV,UV,VV,IP
- 浏览次数(PV):即通常说的PV(PageView)值,用户每打开1个网站页面,记录1个PV。用户多次打开同一页面PV累计多次。用以衡量网站用户访问的网页数量。
1. 每行都有一个省ID的属性。
2. 对相同属性的省ID统计到一个组中
3. 对可能不完整的数据筛选(属性数量必须大约30,省ID不能为空,访问路径不能为空,省ID必须是正确的值(整型))
4. 对每个组的数累加,获取每个省的访问数量。
/*** map* WEBPVMAP_COUNTER 自定义计数器*/public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {String linstring = value.toString();String[] strs = linstring.split("\t");//属性数量必须大于30if(strs.length < 30){context.getCounter("WEBPVMAP_COUNTER","STRSLENGHT_LT30_COUNTERS").increment(1l);return;}String provinceidStr = strs[23];String url = strs[1];//省值不能为空if(StringUtils.isBlank(provinceidStr)){context.getCounter("WEBPVMAP_COUNTER","PROVINCEIDSTR_NULL_COUNTERS").increment(1l);return;}//访问路径不能为空if(StringUtils.isBlank(url)){context.getCounter("WEBPVMAP_COUNTER","URL_NULL_COUNTERS").increment(1l);return;}int provinceid = Integer.MAX_VALUE;try {provinceid = Integer.valueOf(provinceidStr);} catch (Exception e) {context.getCounter("WEBPVMAP_COUNTER","CHANGE_EXCEPETION_COUNTERS").increment(1l);return;}//省值必须被正确的赋值if(provinceid == Integer.MAX_VALUE){context.getCounter("WEBPVMAP_COUNTER","PROVINCEID_CE_COUNTERS").increment(1l);return;}mapoutputkey.set(provinceid);context.write(mapoutputkey, mapoutputvalue);}

/*** reduce*/public void reduce(IntWritable key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int showsum = 0;for (IntWritable value : values) {showsum += value.get();}outputvalue.set(showsum);context.write(key, outputvalue);}
- 独立访客(UV):1天内相同访客多次访问网站,只计算为1个独立访客。
- 来访次数/访问次数(VV):VV = VisitView(访问次数):记录所有访客1天内访问了多少次你的网站,相同的访客有可能多次访问您的网站。从访客来到您网站到最终关闭网站的所有页面离开,计为1次访问。若访客连续30分钟没有新开和刷新页面,或者访客关闭了浏览器,则被计算为本次访问结束。
- 1天内不同IP计算一次
/*** map*/protected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {String[] split = value.toString().split("\\s");int length = split.length;//统计数组长度 不够 36的if (length < 36) {context.getCounter(VisitMistake.LENGTH_LT_36).increment(1);return;}//统计URL为空的if (StringUtils.isBlank(split[1])) {context.getCounter(VisitMistake.URL_IS_NULL).increment(1);return;}// 获取当前登录的用户IdString guid = split[5];if (StringUtils.isBlank(guid)) {context.getCounter(VisitMistake.GUID_IS_NULL).increment(1);return;}//将当前用户加入到UV中进行统计context.write(TEXT_UV, new Text(guid));String ip = split[13];if (StringUtils.isBlank(guid)) {context.getCounter(VisitMistake.IP_IS_NULL).increment(1);return;}//将当前IP加入到IP中统计context.write(TEXT_IP, new Text(ip));}
/*** reduce*/public void reduce(Text key, Iterable<Text> iterable, Context context)throws IOException, InterruptedException {Set<String> sets = new HashSet<String>();//加入Set中去除重复的数据for (Text writable : iterable) {sets.add(writable.toString());}context.write(key, new LongWritable(sets.size()));}
/*** 计数器(枚举)*/package com.zc.hadoop.hdfs.enums;public enum VisitMistake {URL_IS_NULL , PROVINCE_ID_IS_NULL , LENGTH_LT_36 ,PROVINCE_ID_ERROR, GUID_IS_NULL , IP_IS_NULL}
在此输入正文