SparkCore项目实战|Top10热门品类|Top10热门品类中每个品类的Top10活跃Session统计|页面单跳转化率统计

数据分析

本项目的数据是采集电商网站的用户行为数据,主要包含用户的4种行为:搜索、点击、下单和支付。

在这里插入图片描述

(1)数据采用_分割字段
(2)每一行表示用户的一个行为,所以每一行只能是四种行为中的一种。
(3)如果搜索关键字是null,表示这次不是搜索
(4)如果点击的品类id和产品id是-1表示这次不是点击
(5)下单行为来说一次可以下单多个产品,所以品类id和产品id都是多个,id之间使用逗号,分割。如果本次不是下单行为,则他们相关数据用null来表示
(6)支付行为和下单行为类似

在这里插入图片描述

字段说明

编号 字段名称 字段类型 字段含义
1 date String 用户点击行为的日期
2 user_id Long 用户的ID
3 session_id String Session的ID
4 page_id Long 某个页面的ID
5 action_time String 动作的时间点
6 search_keyword String 用户搜索的关键词
7 click_category_id Long 某一个商品品类的ID
8 click_product_id Long 某一个商品的ID
9 order_category_ids String 一次订单中所有品类的ID集合
10 order_product_ids String 一次订单中所有商品的ID集合
11 pay_category_ids String 一次支付中所有品类的ID集合
12 pay_product_ids String 一次支付中所有商品的ID集合
13 city_id Long 城市 id

需求一:Top10热门品类

品类是指产品的分类,大型电商网站品类分多级,咱们的项目中品类只有一级,不同的公司可能对热门的定义不一样。我们按照每个品类的点击、下单、支付的量来统计热门品类。
鞋 点击数 下单数 支付数
衣服 点击数 下单数 支付数
生活用品 点击数 下单数 支付数
例如,综合排名=点击数20%+下单数30%+支付数*50%
本项目需求优化为:先按照点击数排名,靠前的就排名高;如果点击数相同,再比较下单数;下单数再相同,就比较支付数。

需求分析

在这里插入图片描述

代码实现

package com.atguigu.req

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

import scala.collection.mutable.ListBuffer

object TopN {
   
  def main(args: Array[String]): Unit = {
   
    //1.创建SparkConf并设置App名称
    val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[*]")

    //2.创建SparkContext,该对象是提交Spark App的入口
    val sc: SparkContext = new SparkContext(conf)

    // 读取数据
    val rdd: RDD[String] = sc.textFile("D:\\MyWork\\WorkSpaceIDEA\\scalaDemo\\spark\\input\\user_visit_action.txt")

    // 对读取的数据进行转换,封装为UserVisitAction,放到RDD中
    val actionRDD: RDD[UserVisitAction] = rdd.map {
   
      line => {
   
        // 对读取的每一行数据进行切分
        val fields: Array[String] = line.split("_")
        // 封装程UserVisitAction对象
        UserVisitAction(
          fields(0),
          fields(1).toLong,
          fields(2),
          fields(3).toLong,
          fields(4),
          fields(5),
          fields(6).toLong,
          fields(7).toLong,
          fields(8),
          fields(9),
          fields(10),
          fields(11),
          fields(12).toLong
        )
      }
    }

    // 对数据进行处理:对每一条用户行为进行处理,转换为一个CategoryCountInfo对象
    val infoRDD: RDD[CategoryCountInfo] = actionRDD.flatMap {
   
      userAction => {
   
        // 判断是否为点击
        if (userAction.click_category_id != -1) {
   
          List(CategoryCountInfo(userAction.click_category_id.toString, 1, 0, 0))
        } else if (userAction.order_category_ids != "null") {
   
          // 判断是否为下单
          // 对下单的品类ID就行切分
          val ids: Array[String] = userAction.order_category_ids.split(",")
          val list_order: ListBuffer[CategoryCountInfo] = ListBuffer[CategoryCountInfo]()
          for (elem <- ids) {
   
            list_order.append(CategoryCountInfo(elem, 0, 1, 0))
          }
          list_order
        } else if (userAction.pay_category_ids != "null") {
   
          // 判断是否为支付
          // 对下单的品类ID就行切分
          val ids: Array[String] = userAction.pay_category_ids.split(",")
          val list_pay: ListBuffer[CategoryCountInfo] = ListBuffer[CategoryCountInfo]()
          for (elem <- ids) {
   
            list_pay.append(CategoryCountInfo(elem, 0, 1, 0))
          }
          list_pay

        } else {
   
          // 其它
          Nil
        }
      
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现统计热门品类top10,可以按照以下步骤进行: 1. 从数据源读入商品数据,每个商品包含商品ID、商品名称、商品所属品类等信息。 2. 根据商品所属品类进行分组,将同一品类的商品放到一起。 3. 统计每个品类下的商品数量,得到每个品类的商品总数。 4. 对每个品类下的商品数量进行排序,得到每个品类的商品数量排名。 5. 取出数量排名前10的品类,即为热门品类top10。 Scala代码示例: ```scala // 从数据源读入商品数据,每个商品包含商品ID、商品名称、商品所属品类等信息 val products = Seq( ("p1", "商品1", "品类1"), ("p2", "商品2", "品类2"), ("p3", "商品3", "品类1"), ("p4", "商品4", "品类2"), ("p5", "商品5", "品类1"), ("p6", "商品6", "品类3"), ("p7", "商品7", "品类2"), ("p8", "商品8", "品类1"), ("p9", "商品9", "品类2"), ("p10", "商品10", "品类3"), ("p11", "商品11", "品类1"), ("p12", "商品12", "品类2"), ("p13", "商品13", "品类3"), ("p14", "商品14", "品类1"), ("p15", "商品15", "品类2") ) // 根据商品所属品类进行分组,将同一品类的商品放到一起 val productsByCategory = products.groupBy(_._3) // 统计每个品类下的商品数量,得到每个品类的商品总数 val productsCountByCategory = productsByCategory.mapValues(_.size) // 对每个品类下的商品数量进行排序,得到每个品类的商品数量排名 val categoryCountRank = productsCountByCategory.toSeq.sortBy(-_._2).zipWithIndex // 取出数量排名前10的品类,即为热门品类top10 val top10Categories = categoryCountRank.take(10).map(_._1._1) // 打印结果 println("热门品类top10:") top10Categories.foreach(println) ``` 输出结果: ``` 热门品类top10: 品类1 品类2 品类3 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值