基于Spark的网上商城用户行为分析

  • 一、业务场景
  • 二、数据集说明
  • 三、操作步骤
    • 阶段一、启动HDFS、Spark集群服务和zeppelin服务器
    • 阶段二、准备案例中用到的数据集
    • 阶段三、对数据集进行探索和分析
    • 阶段四、自我练习

申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址
全文共计5329字,阅读大概需要3分钟

  1. 实验室名称:
    大数据实验教学系统

  2. 实验项目名称:
    案例:网上商城用户行为分析

一、业务场景

某大型电商网站收集有用户在2014年购物行为数据,包含了300000条数据记录。现希望大数据分析团队使用Spark技术对这些数据进行分析,以期获得有价值的信息。

二、数据集说明

本案例用到的数据集说明如下:
  数据集文件:/data/dataset/batch/user_action.csv
  该数据来源于某电商网站的用户在2014年购物行为数据,包含了300000条数据记录。

1.       字段                     定义
2.      uid                     (自增序列值)
3.      user_id                 (用户id)
4.      item_id                 (商品id)
5.      behaviour_type          (包括浏览、购买、退货)
6.      item_category           (商品分类)
7.      visit_data              (该记录产生时间)
8.      user_address            (用户所在地)
9.      browser                 (客户端所使用的浏览器)

三、操作步骤

阶段一、启动HDFS、Spark集群服务和zeppelin服务器

1、启动HDFS集群
  在Linux终端窗口下,输入以下命令,启动HDFS集群:

1.   $ start-dfs.sh

2、启动Spark集群
  在Linux终端窗口下,输入以下命令,启动Spark集群:

1.   $ cd /opt/spark
2.  $ ./sbin/start-all.sh

3、启动zeppelin服务器
  在Linux终端窗口下,输入以下命令,启动zeppelin服务器:

1.   $ zeppelin-daemon.sh start

4、验证以上进程是否已启动
  在Linux终端窗口下,输入以下命令,查看启动的服务进程:

1.   $ jps

如果显示以下6个进程,则说明各项服务启动正常,可以继续下一阶段。

1.   2288 NameNode
2.  2402 DataNode
3.  2603 SecondaryNameNode
4.  2769 Master
5.  2891 Worker
6.  2984 ZeppelinServer

阶段二、准备案例中用到的数据集

1、将本案例要用到的数据集上传到HDFS文件系统的/data/dataset/batch/目录下。在Linux终端窗口下,输入以下命令:

1.   $ hdfs dfs -mkdir -p /data/dataset/batch
2.  $ hdfs dfs -put /data/dataset/batch/user_action.csv /data/dataset/batch/

2、在Linux终端窗口下,输入以下命令,查看HDFS上是否已经上传了该数据集:

1.   $ hdfs dfs -ls /data/dataset/batch/

这时应该看到数据集文件user_action.csv已经上传到了HDFS的/data/dataset/batch/目录下。

阶段三、对数据集进行探索和分析

1、新建一个zeppelin notebook文件,并命名为rdd_project。
  2、加载数据集到RDD。在notebook单元格中,输入以下代码,加载数据集到RDD:

1.   val filePath = "/data/dataset/batch/user_action.csv"   // 定义要加载数据集的hdfs路径
2.  val userActionRDD = sc.textFile(filePath)              // 读取数据集到rdd
3.       
4.  userActionRDD.cache   // 缓存rdd

同时按下Shift+Enter,执行以上代码。

3、简单探索。

1.   userActionRDD.take(1)

同时按下Shift+Enter,执行以上代码,输出内容如下:
Array[String] = Array(1,10001082,285259775,浏览,4076,2014-11-11,福建,Safari)
   由以上输出内容可知引数据集的数据格式。其中:
   - 数组的第2个元素是用户id
   - 数组的第3个元素是商品id
   - 数组的第4个元素是用户行为(值包括”浏览”、”购买”、”退货”)
   - 数组的第5个元素为该商品所属类别的id
   - 数组的第6个元素为此用户行为发生的日期
   - 数组的第7个元素为用户用户所在地
   - 数组的第8个元素为用户所使用的浏览器类型。

4、转换为RDD[Array[String]]。在notebook单元格中,输入以下代码,对每行数据按逗号进行分割:

1.   val userRDD = userActionRDD.map(line => line.split(","))
2.  userRDD.take(2)
3.  userRDD.cache

5、查看前10位用户的行为(即behavior_type字段的值)。在notebook单元格中,输入以下代码:

1.   userRDD.map(_(3)).take(10).foreach(println)

同时按下Shift+Enter,执行以上代码,输出内容如下:

浏览
浏览
浏览
浏览
浏览
退货
浏览
浏览
浏览
浏览

由以上输出内容可以看出,在前10条用户访问记录中,大多数用户仅仅是浏览商品,甚至还发生了一起退货事件,但是没有购买行为。

6、查看用户访问数据总共有多少。在notebook单元格中,输入以下代码:

1.   userRDD.count

同时按下Shift+Enter,执行以上代码,输出内容如下:

Long = 300000

由以上输出内容可以看出,本数据集总共有30万条用户行为的数据记录。

7、在这30万条用户行为记录数据中,包括有多少个用户?在notebook单元格中,输入以下代码:

1.   userRDD.map(_(1)).distinct.count

同时按下Shift+Enter,执行以上代码,输出内容如下:

Long = 270

由以上输出内容可以看出,总共有270个用户访问,他们造成了30万条用户行为的数据记录。

8、在这个数据集中,总共包含有多少种商品?在notebook单元格中,输入以下代码:

1.   userRDD.map(_(2)).distinct.count

同时按下Shift+Enter,执行以上代码,输出内容如下:

Long = 106919

由以上输出内容可以看出,总共有106919种商品。也就是说,270个用户对十余万种商品进行访问,造成了30万条用户行为的数据记录。

9、这十余万种商品属于多少个商品分类呢?在notebook单元格中,输入以下代码:

1.   userRDD.map(_(4)).distinct.count

同时按下Shift+Enter,执行以上代码,输出内容如下:

Long = 3569

由以上输出内容可以看出,数据集中的十余万种商品属于3569个品类。

10、查询2014年12月15号到2014年12月18号有多少人次浏览了商品。在notebook单元格中,输入以下代码:

1.   userRDD.filter(_(3)=="浏览").
2.          filter(_(5)>="2014-12-15").
3.          filter(_(5)<"2014-12-18").
4.          count

同时按下Shift+Enter,执行以上代码,输出内容如下:

Long = 25636

由以上输出内容可以看出,在2014年12月15号到2014年12月18号这三天中,一其有25636人次浏览了商品。

11、统计每天网站卖出的商品个数。所谓卖出的商品个数,即用户行为为”购买”的记录数量。在notebook单元格中,输入以下代码:

1.   // 这里定义一个转换函数,用来对日期进行格式化
2.  def convert(dt:String):String = {3.      val sdf = new java.text.SimpleDateFormat("yyyy-MM-dd")
4.      sdf.format(sdf.parse(dt))
5.  }
6.       
7.  userRDD.filter(_(3)=="购买").               // 仅统计发生了购买的数据
8.          map(arr => (convert(arr(5)),1)).    // 生成(日期,1)元组
9.          reduceByKey(_ + _).                 // 按天进行统计汇总
10.         sortBy(_._1).                       // 按购买日期进行排序
11.         take(5).foreach(println)            // 查看前5天的记录

同时按下Shift+Enter,执行以上代码,输出内容如下:

(2014-12-17,326)
(2014-12-18,358)
(2014-12-16,377)
(2014-12-15,462)
(2014-12-14,487)

由以上输出内容可以看出,在2014年12月18号这一天,卖出的商品最少;而在2014年12月14号这一天,卖出的商品最多。实际上,卖出商品最少的一天是2014年12月17号这一天,因为这一天没有卖出商品。

12、查询2014年12月14日发货到江西的商品数量。在notebook单元格中,输入以下代码:

1.   userRDD.filter(_(3)=="购买").filter(_(5)=="2014-12-14").filter(_(6)=="江西").count

同时按下Shift+Enter,执行以上代码,输出内容如下:

Long = 14

发货到江西的数量,即江西的用户购买的数量。由以上输出内容可以看出,在2014年12月14号这一天,发货到江西的商品有14件。

13、查询用户’100489195’在2014-11-11这一天点击该网站的点击量,以及其点击量在当天网站的总点击量的占比。在notebook单元格中,输入以下代码:

1.   // 查询'100489195'用户在2014-11-11这一天点击该网站的点击量
2.  userRDD.filter(_(1)=="100489195").filter(_(5)=="2014-11-11").count
3.       
4.  // 查询在2014-11-11这一天点击该网站的总点击量
5.  userRDD.filter(_(5)=="2014-11-11").count

同时按下Shift+Enter,执行以上代码,输出内容如下:

Long = 17
Long = 67150

由以上输出内容可以看出,用户’100489195’在2014-11-11这一天点击该网站的点击量是17次,而当天网站的总点击量是67150。这两个结果相除,就得到了比例结果:17/67150。

14、查询2014-12-18这一天在该网站购买的商品数量超过5个的用户id。在notebook单元格中,输入以下代码:

  1. userRDD.filter(_(3)==“购买”).
  2.      filter(_(5)=="2014-12-18").
    
  3.      map(arr => (arr(1),1)).
    
  4.      reduceByKey(_+_).
    
  5.      filter(_._2 > 5).
    
  6.      sortBy(_._2,false).
    
  7.      collect.foreach(println)
    

同时按下Shift+Enter,执行以上代码,输出内容如下:

(103995979,26)
(102115747,26)
(102616570,25)
(101847145,20)
(100695202,12)
(101454268,12)
(100442521,9)
(101490976,9)
(102831484,9)
(101969992,8)
(103193989,8)
(103215328,8)
(103871479,7)
(10176801,7)
(103456642,7)
(102094417,6)
(102033883,6)
(101105140,6)
(102868558,6)
(101982646,6)

由以上输出内容可以看出,2014-12-18这一天在该网站购买的商品数量最多的用户其id是”102115747”。

阶段四、自我练习

请使用Spark RDD,在本案例项目数据集基础上,回答以下问题:
1、统计每天网站卖出的商品个数,按卖出的商品数量由高到低排序输出。
2、请根据用户行为数据,分析用户所采用的浏览器种类,以及每种浏览器所占比例。
3、请根据用户行为数据,分析用户归属地分布。


基于Spark的网上商城用户行为分析相关推荐

  1. java基于springboot的网上商城购物系统

    项目介绍 随着社会的快速发展,计算机的影响是全面且深入的.人们生活水平的不断提高,日常生活中人们对网上商城购物系统方面的要求也在不断提高,购物的人数更是不断增加,使得网上商城购物系统的开发成为必需而且 ...

  2. 基于电商数据的用户行为分析之需求分析

    电商用户行为分析需求分析说明书 项目名称: 电商用户行为分析 修订时间: 2021-05-28 修订版本: 1.0 一.引言 1.目的 通过编写需求分析文档,对基于电商数据的用户行为分析系统进行介绍, ...

  3. android网上书城设计报告,基于安卓的网上商城手机APP设计与实现

    摘要: 近几年来,随着互联网和多媒体运营的持续和有效的迅猛发展,大多数人都开始选择在网上进行足不出户就可以品尝天下鲜的生活,Internet这个英语名词在人们的生活中变成了熟悉和时尚的冥思.人们的生活 ...

  4. 基于SSM的网上商城系统设计与实现

    今天给大家分享一个基于SSM的网上商城系统系统,分享给大家,希望多多支持 源码在文章末尾链接获取 一.项目背景 网上购物的悄然兴起,是社会经济发展的一个产物,与传统的店铺相比,网易购购物平台具有一定的 ...

  5. 网上商城java实现毕业论文,毕业论文--基于Java的网上商城系统的设计与实现

    毕业论文--基于Java的网上商城系统的设计与实现 毕业设计(论文)毕业设计(论文) 题 目 购便宜购物商城 系 别 计算机工程系 专 业 计算机科学与技术 班 级 姓 名 指导教师 下达日期 年 月 ...

  6. 基于php+Mysql网上商城系统 开题报告

      本科生毕业论文 基于PHP+Mysql网上商城系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学本科生毕业论文(设计)开题报 ...

  7. 基于SSM的网上商城(中)

    上一篇已经大致介绍了该项目的结构以及后台部分的管理和界面 具体链接如下: 基于SSM的网上商城(上) 代码链接 这篇来讲讲前台管理和界面的一些内容: 一:前台的展示界面: 1.common公共界面 ( ...

  8. 基于python的网上商城系统 python数码商城系统

    基于python的网上商城系统 python数码商城系统 源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 需要完成的功能主要如下: 一.前台功能模块 ...

  9. 基于javaweb的网上商城系统(java+jsp+servlert+mysql+ajax)

    基于javaweb的网上商城系统(java+jsp+servlert+mysql+ajax) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myec ...

最新文章

  1. R语言函数:length计算长度、seq生成数据序列、rep将数据对象重复N遍复制、cut将连续变量分割为多水平的因子变量、pretty将连续变量x分成n个区间创建合适的断点、cat数据对象拼接
  2. 搬运机器人举杯贺所需的条件_机器人调试工程师的工作是怎样的
  3. 「技术综述」基于弱监督深度学习的图像分割方法综述
  4. Azure CosmosDB (3) 选择适当的一致性级别
  5. 赠书:一本书带你吃透Nginx应用与运维
  6. 网站图片做SEO优化的技巧有哪些?
  7. Hadoop 2.0(YARN/HDFS)学习资料汇总
  8. iPhone4 FaceTime 联通官方教程
  9. 几种流行的JS框架的选择
  10. MS SQL入门基础:系统数据库
  11. 数据库部分重点内容回顾
  12. Web Service 性能测试工具比较
  13. php oracle 需要libmysql.dll么_,Windows7环境下Apache+PHP+MySQL完美配置
  14. 关于复利2.0 3.0
  15. TIOBE 11 月排行榜:Java、C、C ++、Python 和 VB .NET,谁将卫冕冠军?
  16. centos7下创建mysql5.6多实例
  17. 【SQL Server】入门教程-基础篇(一)
  18. 企业微信客户端web页面调试
  19. 注册公司的基本流程 version_1.0
  20. 华为到底玩的哪些汽车技术?

热门文章

  1. interface关键字的介绍及使用
  2. webpack 源码分析(四)——complier模块
  3. Java、JSP网上汽车售票系统
  4. js快排(JavaScript快速排序算法)- 前端面试
  5. Leetcode 矩形
  6. 三种前端实现VR全景看房的方案!说不定哪天就用得上!
  7. 补题(最短路+拆点)HUD-6805
  8. C++基础之什么是谓词、什么是仿函数
  9. ref 引用(vue获取DOM元素)
  10. mybatis的mapper,sql删除语句