• 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
                                )
    }

    本文为学习笔记的记录

  • 相关阅读:
    Open3D(C++) 整体最小二乘拟合平面
    从命令行管理文件
    计算机毕业设计SSM电商后台管理系统【附源码数据库】
    【React】精选5题
    数据结构与算法概览图
    JavaScript Web APIs第一天笔记
    F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F
    视频打马赛克并追踪
    刷题记录(NC16708 过河卒,NC16619 传球游戏,NC16810 [NOIP1999]拦截导弹)
    Python 实现的简易数据库管理系统 (DBMS)
  • 原文地址:https://blog.csdn.net/qq_55906442/article/details/126087851