【大数据学习篇10】Spark项目实战~网站转化率统计

news2025/1/7 6:30:04

学习目标/Target

掌握网站转化率统计实现思路

了解如何生成用户浏览网页数据

掌握如何创建Spark连接并读取数据集

掌握利用Spark SQL统计每个页面访问次数

 掌握利用Spark SQL获取每个用户浏览网页的顺序

掌握利用Spark SQL合并同一用户浏览的网页

 掌握利用Spark SQL统计每个单跳的次数

掌握利用Spark SQL计算页面单跳转化率

掌握将数据持久化到HBase数据库

熟悉通过Spark On YARN运行程序

概述

        网站转化率(conversion rate)是指用户进行了相应目标行动的访问次数与总访问次数的比率。这里所指的相应目标行动可以是用户登录、用户注册、用户浏览、用户购买等一系列用户行为,因此网站转化率是一个广义的概念。页面单跳转化率是网站转化率的一种统计形式,通过统计页面单跳转化率,来优化页面布局及营销策略,使访问网站的用户可以更深层次的浏览网站。本章我们将对用户浏览网页数据进行分析,从而统计出页面单跳转化率。

1. 数据集分析

        通过编写的Java程序模拟生成用户浏览网页数据作为数据集,数据集中的每一行数据代表一个用户的浏览行为,所有浏览行为都与页面-和用户有关。

{ "actionTime":"2020-07-22 06:34:02", "sessionid":"98ac879b5a0a4a4eb117dffd84da1ff4", "pageid":3, "userid":8 }

actionTime: 用户访问页面的时间;

sessionid:用于标识用户行为的唯一值;

pageid:用户浏览网页的ID;

userid:用户ID;

2.实现思路分析

        当用户浏览网页时,通过当前浏览页面(A)跳转到另一个页面(B),此用户行为被称为一次A→B的单跳。如计算A→B的页面单跳转化率,则计算公式如下。

A→B页面单跳转化率=A→B的单跳总数/A总访问次数

计算页面单跳转化率需要两部分数据,分别是A→B的单跳总数和A总访问次数。

A总访问次数可以通过聚合操作获取,A→B的单跳总数实现思路如下。

根据用户ID和访问时间对数据集进行排序操作,获取每个用户浏览网页的顺序。

根据用户ID对排序后的数据进行分组操作,将同一用户浏览的网页进行合并。

对分组后的数据进行转换操作,将同一用户浏览的网页按照浏览顺序转换为单跳形式。

对转换后的数据进行聚合操作统计每个单跳的总数,其中包括A→B的单跳总数。

页面单跳转化率统计实现过程。

3.实现网站转化率统计

 3.1  生成用户浏览网页数据

        在项目SparkProject的 java目录新建Package包“cn.itcast.conversion”,用于存放实现网站转化率统计的Java文件。在包“cn.itcast.conversion”中创建文件GenerateData.java,用于模拟生成用户浏览网页数据。

        选中文件GenerateData.java并单击右键,在弹出的菜单栏选择“Run.GenerateData.main()”运行程序,生成用户浏览网页数据。

        程序运行完成后在“D:\\sparkdata”目录中会生成JSON文件user_conversion.json,该文件包含用户浏览网页数据。

3.2  修改pom.xml文件

        由于实现网站转化率统计是通过Spark SQL程序实现,所以需要在项目SparkProject的pom.xml文件中添加Spark SQL依赖。

<dependency>

     <groupId>org.apache.spark</groupId>

     <artifactId>spark-sql_2.11</artifactId>

     <version>2.3.2</version>

</dependency>

3.3  创建Spark连接并读取数据集

        在项目SparkProject的包“cn.itcast.conversion”中创建文件PageConversion.java,用于实现网站转化率统计。

public class PageConversion {

    public static void main(String[] arg){

    //实现Spark SQL程序

    }

        在文件PageConversion.java的main()方法中创建SparkSession对象,用于实现Spark SQL程序。

SparkSession spark = SparkSession

    .builder()

    //设置Application名称为page_conversion

    .appName("page_conversion")

    .getOrCreate();

        在文件PageConversion.java的main()方法中,调用SparkSession对象的read().json()方法读取外部JSON文件,将JSON文件中的数据加载到userConversionDS。

Dataset<Row> userConversionDS = spark.read().json(arg[0]);

        在文件PageConversion.java的main()方法中,调用DataSet的createOrReplaceTempView()方法,将userConversionDS创建为全局临时视图conversion_table。        

userConversionDS.createOrReplaceTempView("conversion_table");

3.4  统计每个页面访问次数

在文件PageConversion.java的main()方法中,调用SparkSession的sql()方法统计每个页面访问次数,将统计结果加载到pageIdPvDS。

Dataset<Row> pageIdPvDS = spark

    .sql("select pageid,count(*) as pageid_count " +

            "from conversion_table " +

            "group by pageid");

3.5  获取每个用户浏览网页的顺序\

        在文件PageConversion.java的main()方法中,调用SparkSession的sql()方法对每个用户浏览网页的顺序进行排序,将排序结果加载到useridGroupSortDS。

Dataset<Row> useridGroupSortDS = spark

    .sql("select userid,actionTime,pageid " +

            "from conversion_table " +

            "order by userid,actionTime");

        在文件PageConversion.java的main()方法中,调用DataSet的createOrReplaceTempView()方法,将useridGroupSortDS创建为全局临时视图conversion_group_sort_table。

useridGroupSortDS.createOrReplaceTempView("conversion_group_sort_table");

3.6  合并同一用户浏览的网页

        在文件PageConversion.java的main()方法中,调用SparkSession的sql()方法对同一用户浏览的网页进行合并,将合并结果加载到pageConversionRDD。为了后续使用flatMap()算子对合并后的数据进行扁平化处理,这里通过SparkSession的toJavaRDD()方法将DataSet转为JavaRDD。

JavaRDD<Row> pageConversionRDD = spark.sql("select userid," +     "concat_ws(',',collect_list(pageid)) as column2s " +     "from conversion_group_sort_table " +     "group by userid").toJavaRDD();

3.7  统计每个单跳的次数

        在文件PageConversion.java的main()方法中,使用flatMap()算子对pageConversionRDD进行扁平化处理,根据用户浏览网页的顺序将相邻网页拼接为单跳,将处理结果加载到rowRDD。

JavaRDD<Row> rowRDD = pageConversionRDD.flatMap(new FlatMapFunction<Row, Row>() {     @Override     public Iterator<Row> call(Row row) throws Exception {

        List<Row> list = new ArrayList<>();

        String[] page = row.get(1).toString().split(",");

        String pageConversionStr = "";  

      for (int i = 0;i<page.length-1;i++){

        if (!page[i].equals(page[i+1])){

            pageConversionStr = page[i]+"_"+page[i+1];

            list.add(RowFactory.create(pageConversionStr));

        }

    }

        return list.iterator();

    }

});

        在文件PageConversion.java的main()方法中,调用SparkSession的createDataFrame()方法和 registerTempTable()方法,将存储单跳数据的rowRDD注册临时表page_conversion_table。

StructType schema = DataTypes.createStructType(new StructField[]{     DataTypes.createStructField( "page_conversion",DataTypes.StringType,true)     }); spark.createDataFrame(rowRDD, schema).registerTempTable("page_conversion_table");

        在文件PageConversion.java的main()方法中,使用SparkSession的sql()方法统计每个单跳的次数,根据统计结果创建全局临时视图page_conversion_count_table。

spark.sql(

    "select page_conversion," +

    "count(*) as page_conversion_count " +

    "from page_conversion_table " +

    "group by page_conversion")

    .createOrReplaceTempView("page_conversion_count_table");

3.8  计算页面单跳转化率

        通过页面单跳转化率的计算公式得知,若要计算单跳A→B的页面单跳转化率,首先需要获取页面A的访问次数,然后需要获取单跳A→B的次数,最终将这两部分数据代入页面单跳转化率的计算公式中计算单跳A→B的页面单跳转化率。 在计算每个单跳的页面单跳转化率之前,需要将每个页面与每个单跳进行一一对应,也就是说如果计算单跳A→B的页面单跳转化率,那么代入页面单跳转化率计算公式中的一定是页面A的访问次数,而不能是页面B或C的访问次数。

        在文件PageConversion.java的main()方法中,使用SparkSession的sql()方法拆分单跳为起始页面和结束页面,将拆分后的数据加载到pageConversionCountDS。

Dataset<Row> pageConversionCountDS = spark

    .sql("select page_conversion_count," +

        "split(page_conversion,'_')[0] as start_page," +

        "split(page_conversion,'_')[1] as last_page " +

        "from page_conversion_count_table");

        在文件PageConversion.java的main()方法中,使用join()算子对pageIdPvDS(存储每个页面访问的次数)和pageConversionCountDS(存储每个单跳拆分后的数据)进行连接,根据连接结果创建全局临时视图page_conversion_join。

pageConversionCountDS.join(

            pageIdPvDS,

            new Column("start_page").equalTo(new Column("pageid")),             "left").createOrReplaceTempView("page_conversion_join");

        在文件PageConversion.java的main()方法中,使用SparkSession的sql()计算页面单跳转化率,将计算结果加载到resultDS。

Dataset<Row> resultDS = spark .sql("select " +

    "concat(pageid,'_',last_page) as conversion," +

    "round(" +

    "CAST(page_conversion_count AS DOUBLE)/CAST(pageid_count AS DOUBLE)" +

    ",3) as rage " +

   "from page_conversion_join");

3.9  数据持久化

        在PageConversion类中添加方法conversionToHBase(),用于将页面单跳转化率统计结果持久化到HBase数据库中,该方法包含参数dataset,表示需要向方法中传递页面单跳转化率统计结果数据。

public static void conversionToHBase(Dataset<Row> dataset) throws IOException {     HbaseUtils.createTable("conversion","page_conversion");

    String[] column = {"convert_page","convert_rage"};

    dataset.foreach(new ForeachFunction<Row>() {

        @Override

        public void call(Row row) throws Exception {

            String conversion = row.get(0).toString();

            String rage = row.get(1).toString();

            String[] value ={conversion,rage};

            HbaseUtils.putsToHBase("conversion",conversion+rage,"page_conversion",column,value);

        }

    });

}

        在文件PageConversion.java的main()方法中,调用conversionToHBase()方法并传入参数resultDS,用于在Spark SQL程序中实现conversionToHBase()方法,将页面单跳转化率统计结果数据持久化到HBase数据库中的数据表conversion。

try {

      conversionToHBase(resultDS);

} catch (IOException e) {  

    e.printStackTrace(); }

HbaseConnect.closeConnection();

spark.close();

4.运行程序

        在IntelliJ IDEA中将页面单跳转化率统计程序封装成jar包,并上传到集群环境中,通过spark-submit将程序提交到YARN中运行。

封装jar包:

由于在封装各区域热门商品Top3分析程序jar包时,将程序主类指向了“cn.itcast.top3.AreaProductTop3”,因此这里需要将pom.xml文件中的程序主类修改为“cn.itcast.conversion.PageConversion”。根据封装热门品类Top10分析程序jar包的方式封装页面单跳转化率统计程序。将封装完成的jar包重命名为“PageConversion”,通过远程连接工具SecureCRT将PageConversion.jar上传到虚拟机Spark01的/export/SparkJar/目录下。

将数据集上传到本地文件系统:

        使用远程连接工具SecureCRT连接虚拟机Spark01,在存放数据文件的目录/export/data/SparkData/(该目录需提前创建)下执行“rz”命令,将数据集user_conversion.json上传至本地文件系统。

在HDFS创建存放数据集的目录:

将数据集上传到HDFS前,需要在HDFS的根目录创建目录page_conversion,用于存放数据集user_conversion.json。

hdfs dfs -mkdir /page_conversion

上传数据集到HDFS:

将目录/export/data/SparkData/下的数据集user_conversion.json上传到HDFS的page_conversion目录下,具体命令如下。

hdfs dfs -put /export/data/SparkData/user_conversion.json /page_conversion

提交页面单跳转化率统计程序到YARN集群:

        通过Spark安装目录中bin目录下的shell脚本文件spark-submit提交页面单跳转化率统计程序到YARN集群运行。

spark-submit \

--master yarn \

--deploy-mode cluster \

--num-executors 3 \

--executor-memory 2G \

--class cn.itcast.conversion.PageConversion \

/export/SparkJar/PageConversion.jar /page_conversion/user_conversion.json

查看程序运行结果:

在虚拟机Spark01执行“hbase shell”命令,进入HBase命令行工具。

在HBase命令行工具中执行“list”命令,查看HBase数据库中的所有数据表。

> list

TABLE                                                                                                                                       conversion 

查看程序运行结果

在HBase命令行工具执行“scan 'conversion'”命令,查看数据表conversion中所有数据。

        本文主要讲解了如何通过用户浏览网页数据实现网站转化率统计,首先我们对数据集进行分析,使读者了解用户浏览网页数据的数据结构。接着通过实现思路分析,使读者了解网站转化率统计的实现流程。然后通过IntelliJ IDEA开发工具实现网站转化率统计程序并将统计结果存储到HBase数据库,使读者掌握运用Java语言编写Spark SQL和HBase程序的能力。最后封装网站转化率统计程序并提交到集群运行,使读者掌握运用IntelliJ IDEA开发工具封装Spark SQL程序以及Spark ON YARN模式运行Spark SQL程序的方法。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓基础巩固(三)多线程、数据存储、文件IO、SQLite

文章目录 多线程Handler相关概念UI线程/主线程MessageMessage QueueLooperHandler 使用步骤Handler.sendMessage&#xff08;&#xff09;Handler.post&#xff08;&#xff09; Handler 机制工作原理Handler内存泄露前置知识案例分析解决方案一&#xff1a;静态内部类弱引用解…

数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)

目录 题目描述 算法思路 伪代码 总体算法 BFS算法 伪代码解读 BFS算法 图解 题目描述 六度空间理论的核心观点是&#xff0c;人类社交网络中的任何两个人之间&#xff0c;平均只需要通过不超过六个中间人&#xff08;也就是六个社交关系&#xff09;就可以建立联系。换…

多台plc之间如何快速实现以太网无线连接?

常规来说&#xff0c;多台plc要实现以太网无线连接&#xff0c;首先要先确定以太网线必须正确连接&#xff0c;并建立物理连接。然后需要在PLC端设置好IP地址&#xff0c;以使不同PLC以相同协议可以实现通信交流。最后是建立PLC端数据采集及交换系统&#xff0c;要求在PLC端设置…

《封号码罗》关于js逆向猿人学第二题cookies里面m值的获取[纯扣算法](二十六)

这一题有点儿误打误撞的感觉。 本题使用了抓包工具Fiddler&#xff0c;m值在cookie里面&#xff0c;而且这个cookie是本地生成的 抓包发现有两次请求&#xff0c;第一次返回了一堆JS&#xff0c;而且cookie里面没有m值&#xff0c;第二次请求就带上了m值&#xff0c;所以m应该…

信号完整性分析基础知识之传输线和反射(七):带负载传输线、感性不连续引起的反射

带负载传输线 如果在传输线上有一个小的容性负载&#xff0c;信号会出现失真&#xff0c;上升时间也会降低。每个分立电容都会降低信号在其附近看到的阻抗。如果传输线上分布有多个容性负载&#xff08;例如一个总线上每隔1.2inch有一个2pF的连接器残桩&#xff0c;或者一个内…

单模光纤一维模场分布的MATLAB仿真

根据已知的单模光纤电场z分量分布&#xff0c;可以用MATLAB展示一维的模场分布 具体来说&#xff0c;通过数值计算解出给定光纤&#xff08;n_1&#xff0c;n_2&#xff0c;a&#xff09;参数时对应的V参量 通过特征方程解出V对应的W和U 通过这三个参数带入到光场的表达式中…

07. 算法之一致性哈希算法介绍

前言 哈希算法在程序开发中的很多地方都能看到他的身影&#xff0c;但是哈希有他的局限性&#xff0c;比如如果两个key哈希到同一个位置的时候&#xff0c;此时就不好处理。本节我们介绍一下常规处理方式。 1. 什么是哈希算法 哈希算法将任意长度的二进制值映射为较短的固定…

界面控件DevExtreme使用指南 - 如何自定义上下文菜单和工具栏

DevExtreme File Manager&#xff08;文件管理器&#xff09;小部件现在支持自定义内置的工具栏和上下文菜单&#xff0c;用户可以使用标准和定义的命令项填充项目集合&#xff0c;并配置设置来更改其外观和操作。 DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#x…

基于Keras-YOLO实现目标检测

Keras-YOLO 3项目使用Python语言实现了YOLO v3网络模型&#xff0c;并且可以导入Darknet网络预先训练好的权重文件信息直接使用网络进行目标识别。 1. 下载Keras-YOLO 3项目 执行如下命令下载Keras-YOLO 3项目代码&#xff1a; git clone https://github.com/qqwweee/keras-…

直播和短视频美颜sdk的开发流程、代码分析

目前&#xff0c;美颜技术是提高视频质量的重要手段之一&#xff0c;特别是短视频和直播两个行业。本文将介绍其开发流程和代码分析。 一、美颜SDK的开发流程 1.需求分析 首先我们需要明确的一点就是“需求”&#xff0c;例如&#xff1a;美颜效果、美颜程度、性能要求等。同…

解决找不到微信支付V3版本公钥问题

参考微信文档链接为签名验证-接口规则 | 微信支付商户平台文档中心 写的内容特别不明显&#xff0c;往下面看会找到 下载openssl工具使用命令从私钥证书中导出即可。

地图在线编辑平台,无基础轻松实现私域地图

位构云平台让用户轻松构建诸如空间信息管理、建筑信息管理及三维空间数据可视化、导航等类型应用的多平台、综合型地图引擎&#xff0c;基于OpenGLES/WebGL三维可视化技术体系的自主研发图形引擎&#xff0c;可以让开发者轻松构建运行在 Web、Android、iOS 等多平台的应用程序。…

安捷伦DSO80404B(Agilent)dso80404b租售回收 数字示波器

DSO80404B 是 Agilent 的 4 GHz、4 通道数字示波器。测量电子电路或组件中随时间变化的电压或电流信号&#xff0c;以显示振幅、频率和上升时间等。应用包括故障排除、生产测试和设计。 附加功能&#xff1a; 4 GHz 带宽&#xff0c;可升级至 13 GHz 4个模拟通道 高达 40 G…

day10 前端技术-HTMLCSS

HTML 含义:超文本标记语言,静态网页,用于在浏览器显示数据 双标签:<> </>,开始标签和结束标签同时出现 单标签: 属性名:属性后面的值都加双引号 常用的HTML标签 :文档的根标签 :HTML页面的头部标签 “”:页面标题 “”:页面主体部分 “ “ “ 到 ”:标题…

『树莓派云台机器人』02. 电脑连接树莓派 配置开发环境

目录 1. 下载ssh交互工具 Xshell 与XFTP&#xff08;有过相关使用经历的朋友可以跳过这一节内容&#xff09;2. 下载VNC远程控制工具软件3. 连接过程4. Xshell 命令工具5. XFTP 文件传送工具6. 关于联网总结 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 欢迎关注…

PoseiSwap IDO在Bounce上启动在即,如何参与?

目前&#xff0c;Nautilus Chain 生态基本完成测试&#xff0c;并即将在不久上线主网。PoseiSwap 作为 Nautilus Chain 上的首个 DEX&#xff0c;也即将面向市场并上线正式版本。我们看到&#xff0c; PoseiSwap 也正式发布了新的市场进程&#xff0c;基于其治理代币 POSE 的 I…

转辙机介绍

简介 转辙机是指用以可靠地转换道岔位置&#xff0c;改变道岔开通方向&#xff0c;锁闭道岔尖轨&#xff0c;反映道岔位置的重要的信号基础设备&#xff0c;它可以很好地保证行车安全&#xff0c;提高运输效率&#xff0c;改善行车人员的劳动强度。 分类 01、转辙机按动作时…

如何做出有价值的知识管理文档?

知识管理文档是企业中重要的资产&#xff0c;它可以帮助企业员工更好地理解业务流程、产品功能、标准操作等信息。如何做出有价值的知识管理文档&#xff0c;满足员工知识需求&#xff0c;提高工作效率&#xff0c;本文将探讨以下几个方面&#xff1a; 一、制定有效的知识管理…

jsp网上鞋城系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 网上鞋城系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5 开发&#xff0c;数据库为Mysql&#xff0c;使用j…

建议熟知:2023谷歌新搜索规则!

谷歌作为全球最大的搜索引擎之一&#xff0c;不断更新和调整其搜索算法和规则&#xff0c;以提供更精准、高质量的搜索结果。2023年&#xff0c;谷歌搜索将迎来一系列新的搜索规则&#xff0c;同时&#xff0c;AI工具的快速发展也为谷歌搜索带来了全新的应用场景和可能性。 这…