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

    本文为学习笔记的记录

  • 相关阅读:
    linux&&openwrt网络编程之简单的TCP客户端与服务器、简单的TCP获取图片并网页显示
    通过这些API,开发者可以在自己的应用程序中嵌入电商功能,为用户提供便捷的购物体验
    oracle数据库报列表中最大表达式为1000错误
    Spring Security验证码配置化开发
    什么是用户故事
    使用shell脚本安装hadoop高可用集群
    Java AbstractProcessor不生效问题
    IDEA与Git
    个人怎么投资伦敦金?
    C++对象移动
  • 原文地址:https://blog.csdn.net/qq_55906442/article/details/126087851