spark:页面单跳转换率统计(案例)

目录

介绍

数据准备

代码实现


介绍

如果用户在一次Session过程中访问的页面路径为3,9,10,那么页面3跳到页面9叫一次单跳,单跳转化率就是统计页面点击的概率。

如:计算3-9的单跳转化率,先获取符合条件的Session对于页面3的访问次数A,然后获取符合条件的Session中访问页面3又接着访问页面9的次数B,那么 B/A 就是3-9的页面单跳转化率。

根据这个指标可以去尝试分析整个网站,产品,各个页面的表现,及时作出更改。

数据准备

数据说明:

 时间_用户ID_sessionID_页面ID_动作时间_搜索_点击(品类ID、产品ID)_下单(品类ID、产品ID)_支付(品类ID、产品ID)_城市ID

可以根据数据格式模拟生成数据,也可以在网站爬!

没有数据可以私聊我。

代码实现

import org.apache.spark.{SparkConf, SparkContext}

object TopThree {
  def main(args: Array[String]): Unit = {

    //TODO 创建环境
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("TOP")
    val sc = new SparkContext(sparkConf)

    //TODO 单跳转换率
    //读取日志文件
    val rdd = sc.textFile("datas/action.txt")

    val dataRDD = rdd.map(
      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
        )
      }
    )
    dataRDD.cache()

    //TODO 计算分母
    val pageCount = dataRDD.map(
      action => {
        (action.page_id, 1L)
      }
    ).reduceByKey(_ + _).collect().toMap
    //println(pageCount)

    //TODO 计算分子
    //根据session分组
    val sessionRDD = dataRDD.groupBy(_.session_id)
    //根据时间排序
    val mapRDD = sessionRDD.mapValues(
      iter => {
        val sortList = iter.toList.sortBy(_.action_time)
        val flowIds = sortList.map(_.page_id)
        val pageflowIds = flowIds.zip(flowIds.tail)
        pageflowIds.map(
          t => {
            (t, 1)
          }
        )
      }
    )
    val flatRDD = mapRDD.map(_._2).flatMap(list => list)
    val datacountRDD = flatRDD.reduceByKey(_ + _)
    //计算:分子/分母
    datacountRDD.foreach{
      case ((pageid1,pageid2),sum) => {
        val lon = pageCount.getOrElse(pageid1, 0L)

        println(s"${pageid1}到${pageid2}单跳转换率为:" + (sum.toDouble/lon))
      }
    }
    //TODO 关闭环境
    sc.stop()
  }
  //用户访问动作表
  case class UserVisitAction(
                              date: String,//日期
                              user_id: Long,//用户ID
                              session_id: String,//SessionID
                              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
                            )
}

本文为学习笔记的记录

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值