页面单跳转换率统计案例分析

2024-02-06 03:44

本文主要是介绍页面单跳转换率统计案例分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求说明

页面单跳转化率

        计算页面单跳转化率,什么是页面单跳转换率,比如一个用户在一次 Session 过程中访问的页面路径 3,5,7,9,10,21,那么页面 3 跳到页面 5 叫一次单跳,7-9 也叫一次单跳, 那么单跳转化率就是要统计页面点击的概率。 比如:计算 3-5 的单跳转化率,先获取符合条件的 Session 对于页面 3 的访问次数(PV) 为 A,然后获取符合条件的 Session 中访问了页面 3 又紧接着访问了页面 5 的次数为 B, 那么 B/A 就是 3-5 的页面单跳转化率。

 功能实现

        数据准备:

 // TODO : Top10热门品类val sparkConf = new SparkConf().setMaster("local").setAppName("HotCategoryTop10Analysis")val sc = new SparkContext(sparkConf)val actionRDD = sc.textFile("data/user_visit_action.txt")

        data/user_visit_action.txt :

         定义一个用户访问动作类:

case class UserVisitAction(date: String,//用户点击行为的日期user_id: Long,//用户的 IDsession_id: String,//session 的 IDpage_id: Long,//某个页面的 IDaction_time: String,//动作的时间点search_keyword: String,//用户搜索的关键词click_category_id: Long,//某一个商品品类的 IDclick_product_id: Long,//某一个商品的 IDorder_category_ids: String,//一次订单中所有品类的 ID 集合order_product_ids: String,//一次订单中所有商品的 ID 集合pay_category_ids: String,//一次支付中所有品类的 ID 集合pay_product_ids: String,//一次支付中所有商品的 ID 集合city_id: Long //城市 id)

        然后将每行数据封装成UserVisitAction对象,运用map转换算子:

val actionDateRDD = actionRDD.map( //每行数据封装成UserVisitAction对象action => {val datas = action.split("_")UserVisitAction(datas(0),datas(1).toLong,datas(2),datas(3).toLong,datas(4),datas(5),datas(6).toLong,datas(7).toLong,datas(8),datas(9),datas(10),datas(11),datas(12).toLong)})

        由于统计所有的页面跳转数据量过于庞大,这里就指定一下:

//TODO 对指定页面连续跳转进行统计//1-2,2-3,3-4,4-5,5-6,6-7val ids = List[Long](1, 2, 3, 4, 5, 6, 7)val okflowIds = ids.zip(ids.tail) //List((1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7))

        接下来统计每个页面的被查看的次数,也就是分母,actionDateRDD里面封装的是一个个UserVisitAction对象,运用filter转换算子过滤出List所包含的页面,再用map转换算子将一个UserVisitAction对象转换成(action.page_id, 1L),便于后续的reduceByKey作统计,而toMap方法是将RDD中的数据转换为一个Map对象,需要将所有的数据收集到Driver端,并在Driver端构建Map对象。因此,需要使用collect方法将RDD中的数据拉取到Driver端的内存中,以便在Driver端进行toMap操作。

//TODO 计算分母(计算每个页面的被查看的次数)val pageidToCountMap = actionDateRDD.filter( //过滤出List里面的页面action => {ids.contains(action.page_id)}).map(action => {(action.page_id, 1L)}).reduceByKey(_ + _).collect().toMapprintln("pageidToCountMap: ")pageidToCountMap.foreach(println)

        接下来统计分子,首先根据session_Id进行分组:

val sessionRDD = actionDateRDD.groupBy(_.session_id)

        再将UserVisitAction对象根据访问时间action_time排序,然后用map算子只保留对象的page_id,再用zip拉链:

 val mvRDD = sessionRDD.mapValues(iter => {val sortList = iter.toList.sortBy(_.action_time)val flowIds = sortList.map(_.page_id)val pageflowIds = flowIds.zip(flowIds.tail)

将不满足条件的页面跳转进行过滤:

val mvRDD = sessionRDD.mapValues(iter => {val sortList = iter.toList.sortBy(_.action_time)val flowIds = sortList.map(_.page_id)val pageflowIds = flowIds.zip(flowIds.tail)//将不合法的页面跳转进行过滤pageflowIds.filter(t=>{okflowIds.contains(t)}).map(t => {(t, 1)})})

 mvRDD大致格式长这样:

        sessionid对于我们来说没有用,只需计算后面的页面跳转内容即可,用map算子处理,再用flatmap扁平化处理,便于后续的reduceByKey聚合:

 //((1,2),1)val flatRDD = mvRDD.map(_._2).flatMap(list => list)//((1,2),sum)val dataRDD = flatRDD.reduceByKey(_ + _)

最终计算:

//计算单跳转换率 分子/分母dataRDD.foreach{case ((page1,page2),sum)=>{val cnt = pageidToCountMap.getOrElse(page1, 0L)println(s"页面${page1}到页面${page2}单跳转换率为: "+(sum.toDouble/cnt))}}

这篇关于页面单跳转换率统计案例分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683040

相关文章

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序