@awsekfozc
2015-11-21T05:59:03.000000Z
字数 2967
阅读 2646
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");
//属性数量必须大于30
if(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;
}
// 获取当前登录的用户Id
String 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
}
在此输入正文