一、需求分析
页面转化率?
当前页面–>访问下一个页面的次数 / 访问当前页面的总次数
思路如下:
1.访问是基于页面访问session来统计,每个session都是一次系统访问
2.统计需要统计的每个页面访问的总次数(分母)
3.分子统计:
3.1.按照每个session分组,访问页面时间排序,获取访问页面的顺序列表
3.2.使用sliding 或是zip来连起来,获取前一个页面与后一个页面的访问连接
3.3.过滤掉非统计的访问页面
3.4.聚合所有页面连接访问的次数
4.把页面连接访问次数中第一个page从每个页面总次数中获取,计算访问率
二、代码实现
代码如下(示例):
object PageTransformTest2 {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("PageTransFormTest")
val sc = new SparkContext(sparkConf)
//通常,是有指定的页面统计页面转化率的
val list=List[Long](1,2,3,4,5,6,7)
val zipList: List[(Long, Long)] = list.zip(list.tail)
val textRDD = sc.textFile("data/user_visit_action.txt")
val userVisitActionRDD = textRDD.map {
case str => {
val datas = str.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
)
}
}
userVisitActionRDD.cache()
//TODO 先获取分母
// (页面转化)/当前页面
val fenmuRDD: RDD[(Long, Long)] = userVisitActionRDD.map {
case t => {
(t.page_id, 1L)
}
}.filter{ //过滤非统计指标
case (key,value)=>{
list.init.contains(key) //init 查找集合除最后一个的所有元素
}
}.reduceByKey(_ + _)
//需要行动算子才能执行
val fenmMap: Map[Long, Long] = fenmuRDD.collect().toMap
//根据session分组
val groupSession: RDD[(String, Iterable[UserVisitAction])] = userVisitActionRDD.groupBy(_.session_id)
//TODO
//1.每个session中,根据访问时间排序
//2.排序后转换结构
//3.sliding
// zip 使用zip联合页面到下一个页面的访问
val pageFlowers: RDD[(Long, Long)] = groupSession.mapValues {
case list => {
list.toList.sortBy(_.action_time)
}
}.flatMap {
case (key, value) => {
val list: List[Long] = value.map(_.page_id)
val tuples: List[(Long, Long)] = list.zip(list.tail)
tuples
}
}.filter{ //filter 去除不是需要的页面跳转
case t =>{
zipList.contains(t)
}
}
//分子聚合
val reduceFz: RDD[((Long, Long), Long)] = pageFlowers.map {
case (k, v) => {
((k, v), 1L)
}
}.reduceByKey(_ + _)
val fenzMap: Map[(Long, Long), Long] = reduceFz.collect().toMap
fenzMap.foreach{
case ((page1,page2),sum)=>{
val l = fenmMap.getOrElse(page1,0L)
println(s"页面${page1}跳转至页面${page2}的跳转率为:"+(sum/(l.toDouble)))
}
}
sc.stop()
}
}
case class UserVisitAction(
date: String,//用户点击行为的日期
user_id: Long,//用户的 ID
session_id: String,//Session 的 ID
page_id: Long,//某个页面的 ID
action_time: String,//动作的时间点
search_keyword: String,//用户搜索的关键词
click_category_id: Long,//某一个商品品类的 ID
click_product_id: Long,//某一个商品的 ID
order_category_ids: String,//一次订单中所有品类的 ID 集合
order_product_ids: String,//一次订单中所有商品的 ID 集合
pay_category_ids: String,//一次支付中所有品类的 ID 集合
pay_product_ids: String,//一次支付中所有商品的 ID 集合
city_id: Long
)//城市 id