Sparkcore实操案例----Top10热门品类(笔记)

一、需求说明:

品类是指产品的分类,大型电商网站品类分多级,咱们的项目中品类只有一级,不同的公司可能对热门的定义不一样。我们按照每个品类的点击、下单、支付的量来统计热门品类。

Sparkcore实操案例----Top10热门品类(笔记)_第1张图片

例如,综合排名= 点击数*20%+下单数*30%+支付数*50%

本项目需求优化为:先按照点击数排名,靠前的就排名高;如果点击数相同,再比较下单数;下单数再相同,就比较支付数。

二、需求实现

方案一

1、需求分析

分别统计每个品类点击的次数,下单的次数和支付的次数:(品类,点击总数)(品类,下单总数)(品类,支付总数)

2、逻辑分析

Sparkcore实操案例----Top10热门品类(笔记)_第2张图片

3、代码实现

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

object Spark01_Req1_HotCategoryTop10Analysis {

  def main(args: Array[String]): Unit = {

    //TODO:Top热门品类
    val sparkConf =new SparkConf().setMaster("local[*]").setAppName("HotCategoryTop10Analysis")
    val sc = new SparkContext(sparkConf)

    //1.读取原始日志数据
    val actionRDD =sc.textFile("datas/user_visit_action.txt")

    //2.统计品类的点击数量:(品类ID,点击数量)
    val clickActionRDD = actionRDD.filter(
      action => {
        val datas = action.split("_")
        datas(6) != "-1"
      }
    )

    val clickCountRDD : RDD[(String,Int)] = clickActionRDD.map(
      action => {
        val datas = action.split("_")
        (datas(6), 1)
      }
    ).reduceByKey(_ + _)

    //3.统计品类的下单数量:(品类ID,下单数量)
    val orderActionRDD = actionRDD.filter(
      action => {
        val datas = action.split("_")
        datas(8) != "null"
      }
    )

    val orderCountRDD = orderActionRDD.flatMap(
      action =>{
        val datas = action.split("_")
        val cid = datas(8)
        val cids = cid.split(",")
        cids.map(id =>(id,1))
      }
    ).reduceByKey(_ + _)

    //4.统计品类的支付数量:(品类ID,支付数量)
    val payActionRDD = actionRDD.filter(
      action => {
        val datas = action.split("_")
        datas(10) != "null"
      }
    )

    val payCountRDD = payActionRDD.flatMap(
      action =>{
        val datas = action.split("_")
        val cid = datas(10)
        val cids = cid.split(",")
        cids.map(id =>(id,1))
      }
    ).reduceByKey(_ + _)

    //5.将品类进行排序,并且取前10名
    //  点击数量的排序,下单数量排序,支付数量排序
    //  元组排序:先比较第一个,再比较第二个,再比较第三个,依此类推
    //  (品类ID,(点击数量,下单数量,支付数量))
    // join(排除),zip(没关系,删除),leftOuterJoin(左右不合适,删除),cogroup(可以)=connect + group
    val cogroupRDD:RDD[(String, (Iterable[Int], Iterable[Int], Iterable[Int]))] =
    clickCountRDD.cogroup(orderCountRDD,payCountRDD)
    val analysisRDD = cogroupRDD.mapValues{
      case (clickIter, orderIter,payIter) => {

        var clickCnt = 0
        val iter1 =clickIter.iterator
        if(iter1.hasNext){
          clickCnt = iter1.next()
        }
        var orderCnt = 0
        val iter2 =orderIter.iterator
        if(iter2.hasNext){
          orderCnt = iter2.next()
        }
        var payCnt = 0
        val iter3 =payIter.iterator
        if(iter3.hasNext){
          payCnt = iter3.next()
        }

        (clickCnt,orderCnt,payCnt)

      }
    }

    val resultRDD = analysisRDD.sortBy(_._2, false).take(10)


    //6.将结果采集到控制台打印出来
     resultRDD.foreach(println)

    sc.stop()
  }
}
 

4、运行结果

Sparkcore实操案例----Top10热门品类(笔记)_第3张图片

 

 

 

 

 

你可能感兴趣的:(spark)