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

    本文为学习笔记的记录

  • 相关阅读:
    Java 中if else、多重if、switch效率对比详细讲解
    《前端运维》一、Linux基础--06Shell流程控制
    动作活体检测能力,构建安全可靠的支付级“刷脸”体验
    网络安全-态势感知
    前端收藏夹 ,以及他们的github地址:GitHub - w3ctrain/w3ctrain.github.io: w3ctrian前端收藏夹
    力扣刷题 day43:10-13
    Crypto(1) 攻防世界Caesar
    9/15(实习)一面
    SpringWeb项目获取所有访问路由
    如何修改Notes邮箱中的收件箱标题宽度
  • 原文地址:https://blog.csdn.net/qq_55906442/article/details/126087851