网站数据分析基础(1)

点击流的概念

点击流(Click Stream)是指用户在网站上持续访问的轨迹。这个概念更注
重用户浏览网站的整个流程。用户对网站的每次访问包含了一系列的点击动作行
为,这些点击行为数据就构成了点击流数据(Click Stream Data),它代表了用
户浏览网站的整个流程。
点击流和网站日志是两个不同的概念,点击流是从用户的角度出发,注重用
户浏览网站的整个流程;而网站日志是面向整个站点,它包含了用户行为数据、
服务器响应数据等众多日志信息,我们通过对网站日志的分析可以获得用户的点
击流数据。
网站是由多个网页(Page)构成,当用户在访问多个网页时,网页与网页之
间是靠 Referrers 参数来标识上级网页来源。由此,可以确定网页被依次访问的
顺序,当然也可以通过时间来标识访问的次序。其次,用户对网站的每次访问,
可视作是一次会话(Session),在网站日志中将会用不同的 Sessionid 来唯一标
识每次会话。如果把 Page 视为“点”的话,那么我们可以很容易的把 Session
描绘成一条“线”,也就是用户的点击流数据轨迹曲线。

1 点击流模型生成
点击流数据在具体操作上是由散点状的点击日志数据梳理所得。点击数据在
数据建模时存在两张模型表 Pageviews 和 visits,例如:
在这里插入图片描述

页面点击流模型 Pageviews 表
在这里插入图片描述

点击流模型 Visits 表(按 session 聚集的页面访问信息)
在这里插入图片描述

常见的数据采集信息

1、访客ip地址:

  例如:  58.215.204.118

2、访客用户信息: - -
3、请求时间:

   例如: [18/Sep/2013:06:51:35 +0000]

4、请求方式:

   例如:GET

5、请求的url:

 例如: /wp-includes/js/jquery/jquery.js?ver=1.10.2

6、请求所用协议:

   例如:HTTP/1.1

7、响应码:

  例如:    304

8、返回的数据流量:

  例如:    0

9、访客的来源url:

 例如:   http://blog.fens.me/nodejs-socketio-chat/

10、访客所用浏览器:

  例如: Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0

**

pageview模型和visit模型

在这里插入图片描述

点击流型pageview的代码实现

import cn.itcast.bigdata.weblog.mrbean.WebLogBean;
import cn.itcast.bigdata.weblog.utils.DateUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.io.IOException;
import java.net.URI;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 
 * 将清洗之后的日志梳理出点击流pageviews模型数据
 * 
 * 输入数据是清洗过后的结果数据
 * 
 * 区分出每一次会话,给每一次visit(session)增加了session-id(随机uuid)
 * 梳理出每一次会话中所访问的每个页面(请求时间,url,停留时长,以及该页面在这次session中的序号)
 * 保留referral_url,body_bytes_send,useragent
 *
 * 判断同一个用户两次的时间间隔,如果小于30分钟,就认为是同一个session,如果大于30分钟就认为是多个session
 * 第一步:将同一个用户的所有的数据都找出来,发送到同一个reduce里面去,进行判断
 * 用什么来做K2,会将我同一个用的数据都发送到同一个reduce里面去,通过IP来进行区分不同的用户
 *
 *
 *
 *
 *
 *

 使用IP作为key2


 集合当中的数据,先按照时间进行排序 比较下一条与上一条数据之间的时间间隔
 如果时间间隔小于三十分  session的标识,我们不需要改动,编号顺序的网上涨


 如果时间间隔大于三十分  session的标识,我们需要变动,编号顺序从1开始网上涨
 *
 * @author
 * 
 */
public class ClickStreamPageView extends Configured implements Tool {
   

	@Override
	public int run(String[] args) throws Exception {
   
		Configuration conf = super.getConf();
		Job job = Job.getInstance(conf);

		String inputPath="hdfs://node01:8020/weblog/"+DateUtil.getYestDate()+"/weblogPreOut";
		String outputPath="hdfs://node01:8020/weblog/"+DateUtil.getYestDate()+"/pageViewOut";
		FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), conf);
		if (fileSystem.exists(new Path(outputPath))){
   
			fileSystem.delete(new Path(outputPath),true);
		}
		fileSystem.close();
		job.setInputFormatClass(TextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		FileInputFormat.setInputPaths(job, new Path(inputPath));
		FileOutputFormat.setOutputPath(job, new Path(outputPath));


		job.setInputFormatClass(TextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		TextInputFormat.addInputPath(job,new Path("file:///F:\\日志文件数据\\weblogPreOut2"));
		TextOutputFormat.setOutputPath(job,new Path("file:///F:\\日志文件数据\\pageViewOut2"));

		job.setJarByClass(ClickStreamPageView.class);
		job.setMapperClass(ClickStreamMapper.class);
		job.setReducerClass(ClickStreamReducer.class);
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(WebLogBean.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);

		boolean b = job.waitForCompletion(true);
		return b?0:1;
	}

	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值