摘 要
本文旨在综合分析用户行为模型的特点以实时系统解决方案的基础上,设计并研发一套基于Hadoop的电商实时用户行为分析系统,并在实际的电商网站中进行使用。对电商网站中的用户行为进行分析和研究;分析用户行为分析系统的应用场景并针对实际的应用场景设计一套基于Hadoop的实时用户行为分析系统;开发JAVAEE框架下的实时用户行为分析系统;将实时用户行为分析系统在电商网站中进行投入使用。
本次毕业设计的课题是基于Hadoop的电商用户用户行为的分析系统,那么研究的方向就是大数据中的Hadoop方向,在我的课题中我主要研究的方向是数据的采集来源,通过Flume埋点来采集日志信息,或者通过Nginx反向代理服务器来收集日志信息,来采集到我们需要的用户浏览网页的信息,然后就是研究的大数据的存储问题。
关键词:电商数据;用户行为;分析系统;Hadoop;Java
Abstract
This paper aims to comprehensively analyze the characteristics of user behavior model on the basis of real-time system solutions, design and develop a Hadoop-based real-time user behavior analysis system, and use it in actual e-commerce websites.Analyze and study user behavior in e-commerce websites; analyze the application scenarios of user behavior analysis system and design a real-time user behavior analysis system based on Hadoop; develop real-time user behavior analysis system under JAVAEE framework; and put real-time user behavior analysis system into use in e-commerce website.
The graduation design project is based on Hadoop electricity business user behavior analysis system, so the research direction is the Hadoop direction of big data, in my project my main research direction is the source of data collection, through Flume buried point to collect log information, or through Nginx reverse proxy server to collect log information, to collect our need users to browse the web information, and then is the study of big data storage problem.
Key words: e-commerce data; user behavior; analysis system; Hadoop; Java
目 录
摘 要 I
Abstract II
第1章 绪论 1
1.1 编写目的 1
1.2 背景及意义 1
1.3 开发及运行环境 1
第2章 系统相关技术介绍 3
2.1 hadoop系统架构 3
2.1.1 hadoop 生态架构和概况 3
2.2 HDFS(Hadoop分布式文件系统) 4
2.2.1 HDFS 设计说明 4
2.2.2 HDFS的存储机制和核心 4
2.3 Mapreduce(分布式计算框架) 7
2.3.1 mapreduce计算框架设计说明 7
2.3.2 Hadoop的Mapreduce计算开源框架的计算流程: 8
2.4 Yarn(资源管理框架) 9
2.4.1 yarn的架构 9
2.4.2 yarn的各个角色的职责 10
2.4.3 YARN 作业执行流程 11
2.5 系统中的数据库介绍和其他工具简介 12
2.5.1 hive是什么 12
2.5.2 hive的架构 13
2.5.3 hive的特点 13
2.5.4 hbase是什么 13
2.5.5 hbase的存储机制和表结构 14
2.5.7 数据导入导出工具sqoop和日志收集工具flume 15
第3章 需求分析 17
3.1 系统概述 17
3.2 系统功能需求 17
3.2.1 收集原始数据 17
3.2.2 计算物品相似度矩阵 18
3.2.3 计算用户购买向量 18
3.2.4 计算推荐向量并去重和排序 18
3.2.5 数据入库 18
3.2.6 作业控制 19
3.2.7商品推荐功能 19
3.3 系统非功能需求 19
第4章 概要设计 20
4.1系统架构设计 20
4.2系统层次架构设计 21
4.3系统功能模块设计 22
4.3.1 计算物品相似度矩阵 22
4.3.2推荐矩阵(相似度矩阵*向量) 23
4.3.3对推荐向量进行处理 23
4.3.4数据入库 23
4.4系统数据库设计 24
4.5推荐模块程序流程图 25
4.6系统架构图 25
4.7数据预处理层 26
4.8推荐结果生成层 26
4.9推荐系统流程图 27
第5章 系统实现 28
5.1计算用户购买商品的列表 28
5.2计算商品的共现关系 28
5.3计算用户的购买向量 28
5.4推荐结果 29
5.5数据去重 29
5.6推荐结果入库 30
5.7构建作业流对象 32
第6章 系统测试 33
6.1计算用户购买商品的列表 33
6.2计算商品的共现次数(共现矩阵) 33
6.3计算用户的购买向量 33
6.4推荐结果 33
6.5数据去重 34
6.6推荐结果入库 35
6.7 web系统推荐商品实现 35
总 结 36
参考文献 37
致 谢 39
第3章 需求分析
3.1 系统概述
电商用户分析系统是对用户的历史行为进行挖掘,对用户兴趣信息进行建模,并对用户未来行为进行预测,从而建立用户和内容的关系,满足用户对商品的推荐需求的一种智能系统。通过对主要的推荐算法进行比较分析,模拟实现了基于用户行为的智能推荐系统,提高了推荐算法的有效性。电商用户分析系统是为了更精准的为用户推荐他们想要的内容,如果一个用户在浏览商品信息的时候,通过对用户数据的记录,和已经存在的其他的用户记录进行分析,从而为用户推荐相应的数据。本次毕业设计是基于Hadoop的电商用户分析系统,本此课设通过对用户行为的研究,发现用户购买的偏好波动幅度偏大,如何充分利用这一特征是提高推荐系统精准度的关键。
用户行为数据的处理。电商用户分析系统用户、商品行为主要是用户的购买行为。
购买行为包含了丰富的用户购买商品,如何处理这些购买商品是推荐系统实现的关键。
系统必须具有高扩展性。网上购物每时每刻都会有新的数据产生,都会执行新的购物行为,系统的扩展性变得尤为关键。
推荐系统的推荐质量。推荐系统的最终目的是推荐,所以推荐质量是整个系统设计的最终目的。好的推荐系统需要兼顾系统的精准度、覆盖率以及新颖度。
3.2 系统功能需求
基于Hadoop的商品推荐引擎大致可以分为5部分,分别是:计算用户的购买向量、计算物品的相似度矩阵、计算推荐度及相关处理、数据导入数据库和对于整个项目的全部作业控制。
3.2.1 收集原始数据
推荐系统是基于用户、商品行为数据来进行推荐的,没有用户商品数据的推荐系统是无法进行推荐的。rawdata文件:该文件是收集用户对物品的偏好,形成“用户 物品 偏好”的数据集。数据格式:用户编号 物品编号 偏好值。
本文转载自:http://www.biyezuopin.vip/onews.asp?id=16482
package com.zwj.controller;importjava.io.IOException;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.UUID;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSession;importorg.apache.ibatis.session.SqlSession;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.SessionAttributes;importcom.zwj.service.ProductService;importcom.zwj.service.UserService;importcom.zwj.vo.Cart;importcom.zwj.vo.Product;importcom.zwj.vo.User;//让控制器成为一个bean
@Controller
//这个控制器是接受user_reg页面传过来的参数去操作数据库publicclassUserController{
@Autowired
private SqlSession sqlSession;
@Autowired
private UserService us;
@Autowired
private ProductService ps;
@Autowired
private HttpServletRequest req;privateint count;
@RequestMapping("/userReg.action")//jsp页面通过userReg.action找到这个方法public String userReg(User user) throws IOException{
Map<String,Object> map =newHashMap<String, Object>();
map.put("phone_mobile", user.getPhone_mobile());
map.put("login_password", user.getLogin_password());//判断页面传回的数据要求
Pattern pattern = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(17[6])|(18[01236789]))\\d{8}$");
Matcher matcher = pattern.matcher(user.getPhone_mobile());if(user.getPhone_mobile()==null || user.getLogin_password()==null ||!matcher.matches()){return"pages/register-fail.html";}//获取当前注册时间
Date date =newDate();
DateFormat df =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
map.put("register_time", df.format(date));//生成唯一识别码
String s = UUID.randomUUID().toString();
String user_code = s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24);
map.put("user_code", user_code);//将数据添加到数据库中int a = sqlSession.insert("com.zwj.dao.addUser",map);
req.setAttribute("phone_mobile", user.getPhone_mobile());
req.setAttribute("login_password", user.getLogin_password());return"pages/register-ok.html";}//处理用户名唯一性的判断
@RequestMapping("/userJudge.action")
@ResponseBody
public User userJudge(String phone_mobile){
User u = sqlSession.selectOne("com.zwj.dao.judgeUser",phone_mobile);return u;}//用户登录的判断
@RequestMapping("/userLogin.action")public String userLogin(String phone_mobile,String login_password) throws IOException{//对页面传回的值进行二次判断
Pattern pattern = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(17[6])|(18[01236789]))\\d{8}$");
Matcher matcher = pattern.matcher(phone_mobile);if(phone_mobile==null || login_password==null ||!matcher.matches()){return"pages/login-fail.html";}
User u = us.userLogin(phone_mobile, login_password);//查到用户了,执行登录成功的操作if(u!=null){
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.getSession().setAttribute("u", u);
req.setAttribute("count", count);return"pages/main.jsp";}else{return"pages/login-fail.html";}}//用户退出销毁session 跳转到登录页
@RequestMapping("/userExit.action")public String userExit(HttpSession session){
session.invalidate();return"index.html";}
@RequestMapping("/showCart.action")public String showCart(HttpSession session) throws IOException{
User u =(User) session.getAttribute("u");
List<Cart> c= ps.showCart(Long.parseLong(u.getPhone_mobile()));
req.setAttribute("c", c);return"pages/cart.jsp";}
@RequestMapping("/addCart.action")public String addCart(Long pid,HttpSession session) throws IOException{
Map<String,Object> map =newHashMap<String, Object>();
Product p = ps.showProduct(pid);
User u =(User) session.getAttribute("u");
map.put("uid", u.getPhone_mobile());
map.put("pic", p.getPic());
map.put("pname", p.getName());
map.put("num",1);
map.put("price", p.getPrice());//将数据添加到数据库中int a = sqlSession.insert("com.zwj.dao.addCart",map);
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.setAttribute("count", count);return"pages/addCart-ok.jsp";}
@RequestMapping("/xm6_m.action")public String more_xm(HttpSession session){
User u =(User) session.getAttribute("u");
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.setAttribute("count", count);return"pages/xm6_m.jsp";}
@RequestMapping("/pg_m.action")public String more_pg(HttpSession session){
User u =(User) session.getAttribute("u");
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.setAttribute("count", count);return"pages/pg_m.jsp";}
@RequestMapping("/gl_m.action")public String more_gl(HttpSession session){
User u =(User) session.getAttribute("u");
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.setAttribute("count", count);return"pages/gl_m.jsp";}
@RequestMapping("/jn_m.action")public String more_jn(HttpSession session){
User u =(User) session.getAttribute("u");
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.setAttribute("count", count);return"pages/jn_m.jsp";}
@RequestMapping("/main.action")public String main(HttpSession session){
User u =(User) session.getAttribute("u");
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.setAttribute("count", count);return"pages/main.jsp";}
@RequestMapping("/result.action")public String result(HttpSession session){/*User u = (User) session.getAttribute("u");
count = sqlSession.selectOne("com.zwj.dao.count",u.getPhone_mobile());
req.setAttribute("count", count);*/return"pages/result.jsp";}}
版权归原作者 biyezuopinvip 所有, 如有侵权,请联系我们删除。