需求二:top 10热度中每个品类点击该品类中总次数的top10 session

本文介绍了一种统计方法,用于分析商品品类的点击热度,并从中找出每个热门品类中点击次数最多的前十名会话(session)。通过Spark进行数据处理,实现了从原始数据中提取并聚合相关信息的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、top 10热度中每个品类点击该品类中总次数的top10 session

需求分析:
在有品类热度前10的基础上,统计每个品类点击次数前10的session和每个session点击该品类的次数。

二、代码实现

伪代码:
1.获取前10品类
2.过滤非点击和非前10品类
3.每个品类每个session聚合点击次数
4.分品类聚合,每个session和其点击次数
5.每个品类取前10

代码如下(示例):

object CategroiesTop10ContainSessionTop10 {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("cachAndPersist")
    val sc = new SparkContext(sparkConf)

    //读取数据
    val orgRDD = sc.textFile("datas/user_visit_action.txt")
    val top10: Array[String] = top10HotCateGroies(orgRDD) //top 10热门品类
    val top10BroadCast=sc.broadcast(top10)

    val filterRDD = orgRDD.filter {
      case str => {
        val datas = str.split("_")
        if (datas(6) != "-1") {
          if (top10BroadCast.value.contains(datas(6))) {
            true
          } else {
            false
          }
        } else {
          false
        }
      }
    }

    val reduceRDD: RDD[((String, String), Int)] = filterRDD.map {
      case str => {
        val datas = str.split("_")
        ((datas(6), datas(2)), 1)
      }
    }.reduceByKey(_ + _)

    val groupByKeyRDD: RDD[(String, Iterable[(String, Int)])] = reduceRDD.map {
      case ((cate, session), sum) => {
        (cate, (session, sum))
      }
    }.groupByKey()

    val takeRDD: RDD[(String, List[(String, Int)])] = groupByKeyRDD.mapValues {
      case list => {
        list.toList.sortBy(_._2)(Ordering.Int.reverse).take(10)
      }
    }

    takeRDD.foreach(println)


    sc.stop()
  }

  def top10HotCateGroies(orgRDD:RDD[String]) = {
    val flatMapRDD = orgRDD.flatMap {
      case str => {
        val datas = str.split("_")
        if (datas(6) != "-1") {
          List((datas(6), (1, 0, 0)))
        } else if (datas(8) != "null") {
          val strings = datas(8).split(",")
          strings.map((_, (0, 1, 0)))
        } else if (datas(10) != "null") {
          val strings = datas(10).split(",")
          strings.map((_, (0, 0, 1)))
        } else {
          Nil
        }
      }
    }

    val reduceRDD = flatMapRDD.reduceByKey {
      case (o, t) => {
        (o._1 + t._1, o._2 + t._2, o._3 + t._3)
      }
    }
    val resultRDD = reduceRDD.sortBy(_._2, false).take(10)
    resultRDD.map(_._1)
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值