• spark:商品热门品类TOP10统计(案例)


    目录

    介绍

    数据准备

     代码实现


    介绍

    品类是指产品的分类,大型电商网站品类分多级,一般为三级分类,此次项目中品类只有一级。

    不同的公司对热门的定义不一样。此次按照每个品类的  点击---->下单---->支付  的量来统计热门品类。先按照点击数排名,数量决定排名;点击数相同,比较下单数;下单数相同,比较支付数。

    数据准备

    点击链接下载数据(免费下载) 

    14万条用户行为数据,搜索、点击、下单、支付-spark文档类资源-CSDN下载

    数据说明:

     时间_用户ID_sessionID_页面ID_动作时间_搜索_点击(品类ID、产品ID)_下单(品类ID、产品ID)_支付(品类ID、产品ID)_城市ID

     代码实现

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

    (品类,点击总数)(品类,下单总数)(品类,支付总数)

    import org.apache.spark.{SparkConf, SparkContext}
    
    object TopOne {
      def main(args: Array[String]): Unit = {
        //TODO 创建环境
        val sparkConf = new SparkConf().setMaster("local[*]").setAppName("TOP")
        val sc = new SparkContext(sparkConf)
        //TODO TOP热门商品
        //读取日志文件
        val rdd = sc.textFile("datas/action.txt")
        rdd.cache()
    
        //统计品类点击数量
        //数据清洗
        val clickRDD = rdd.filter(
          action => {
            val datas = action.split("_")
            datas(6) != "-1"
          }
        )
        //提取点击品类和数量并统计数量
        val clickCountRDD = clickRDD.map(
          action => {
            val datas = action.split("_")
            //(品类,数量)
            (datas(6),1)
          }
        ).reduceByKey(_+_)
    //    println(">>>>>>>>>")
    //    clickCountRDD.collect().foreach(println)
    
        //统计品类下单数量
        //数据清洗
        val orderRDD = rdd.filter(
          action => {
            val datas = action.split("_")
            datas(8) != "null"
          }
        )
        //提取下单品类和数量并统计数量
        val ordercountRDD = orderRDD.flatMap(
          action => {
            val datas = action.split("_")
            val cid = datas(8)
            //(品类,数量)
            val cids = cid.split(",")
            cids.map(id => (id, 1))
          }
        ).reduceByKey(_ + _)
    //    println(">>>>>>>>")
    //    ordercountRDD.collect().foreach(println)
    
        //统计品类支付数量
        //清洗数据
        val payRDD = rdd.filter(
          action => {
            val datas = action.split("_")
            datas(10) != "null"
          }
        )
        //提取支付品类和数量并统计数量
        val paycountRDD = payRDD.flatMap(
          action => {
            val datas = action.split("_")
            val cid = datas(10)
            //(品类,数量)
            val cids = cid.split(",")
            cids.map(id => (id, 1))
          }
        ).reduceByKey(_ + _)
    //    println(">>>>>>>>>>>>")
    //    paycountRDD.collect().foreach(println)
    
        //排序————排序顺序:先点击-->再下单-->后支付
        val cogroupRDD = clickCountRDD.cogroup(ordercountRDD, paycountRDD)
        val cogroupRDD2 = 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 = cogroupRDD2.sortBy(_._2, false).take(10)
        //打印
        resultRDD.foreach(println)
        //TODO 关闭环境
        sc.stop()
      }
    }

     

    本文为学习笔记记录!

  • 相关阅读:
    Codeforces Round 836 (Div. 2) A - C
    8、SpringBoot整合hikari连接池
    Spring MVC 框架学习(六)---- 返回页面+加载静态资源
    任务拆解,悠然自得,自动版本的ChatGPT,AutoGPT自动人工智能AI任务实践(Python3.10)
    你好好想想,你真的需要配置中心吗?
    CAN报文的DLC和DataLength的区别
    ELK技术-Logstash
    谈谈从DAMA、DCMM和DGI三大数据治理框架详细了解数据战略规划的关键要素
    基于TCPIP的网络编程(C++语言编程)
    阿里巴巴API接口解析,实现按关键字搜索商品
  • 原文地址:https://blog.csdn.net/qq_55906442/article/details/126034543