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

一、需求说明:

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

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

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

二、需求实现

方案一

1、需求分析

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

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、运行结果

 

 

 

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介:  本项目课程是一门极具综合性和完整性的大型项目课程;课程项目的业务背景源自各类互联网公司对海量用户浏览行为据和业务据分析的需求及企业据管理、据运营需求。 本课程项目涵盖据采集与预处理、据仓库体系建设、用户画像系统建设、据治理(元据管理、据质量管理)、任务调度系统、据服务层建设、OLAP即席分析系统建设等大量模块,力求原汁原味重现一个完备的企业级大型据运营系统。  拒绝demo,拒绝宏观抽象,拒绝只讲不练,本课程高度揉和理论与实战,并兼顾各层次的学员,真正从0开始,循序渐进,每一个步骤每一个环节,都会带领学员从需求分析开始,到逻辑设计,最后落实到每一行代码,所有流程都采用企业级解决方案,并手把手带领学员一一实现,拒绝复制粘贴,拒绝demo化的实现。并且会穿插大量的原创图解,来帮助学员理解复杂逻辑,掌握关键流程,熟悉核心架构。   跟随项目课程,历经接近100+小时的时间,从需求分析开始,到据埋点采集,到预处理程序代码编写,到仓体系搭建......逐渐展开整个项目的宏大视图,构建起整个项目的摩天大厦。  由于本课程不光讲解项目的实现,还会在实现过程中反复揉和各种技术细节,各种设计思想,各种最佳实践思维,学完本项目并勤于实践的话,学员的收获将远远超越一个项目的具体实现,更能对大型据系统开发产生深刻体悟,对很多技术的应用将感觉豁然开朗,并带来融会贯通能力的巨大飞跃。当然,最直接的收获是,学完本课程,你将很容易就拿到大仓建设或用户画像建设等岗位的OFFER课程模块: 1. 据采集:涉及到埋点日志flume采集系统,sqoop业务据抽取系统等; 2. 据预处理:涉及到各类字典据构建,复杂结构据清洗解析,据集成,据修正,以及多渠道据的用户身份标识打通:ID-MAPPING等;3. 据仓库:涉及到hive仓基础设施搭建,仓分层体系设计,仓分析主题设计,多维分析实现,ETL任务脚本开发,ETL任务调度,据生命周期管理等;4. 据治理:涉及据资产查询管理,据质量监控管理,atlas元据管理系统,atlas据血缘管理等;5. 用户画像系统:涉及画像标签体系设计,标签体系层级关系设计,各类标签计算实现,兴趣类标签的衰减合并,模型标签的机器学习算法应用及特征提取、模型训练等;6. OLAP即席分析平台:涉及OLAP平台的整体架构设计,技术选型,底层存储实现,Presto查询引擎搭建,据服务接口开发等;7. 据服务:涉及据服务的整体设计理念,架构搭建,各类据访问需求的restapi开发等;课程所涉及的技术: 整个项目课程中,将涉及到一个大型据系统中所用到的几乎所有主要技术,具体来说,包含但不限于如下技术组件:l Hadoopl Hivel HBasel SparkCore /SparkSQL/ Spark GRAPHX / Spark Mllibl Sqoopl Azkabanl Flumel lasal Kafkal Zookeeperl Solrl Prestop
K-means算法是一种简单有效的聚类算法,在据挖掘和机器学习领域得到广泛应用。对于西瓜品类分析,在进行K-means算法之前,需要先对据进行处理和据预处理。以下是基于python语言的代码实现: 首先,安装所需库 ``` pip install pandas numpy matplotlib seaborn sklearn ``` 接着,导入所需库并读入据 ``` import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.cluster import KMeans # 读入据 data=pd.read_csv('watermelon.csv') ``` 据的预处理包括去掉无用据、据类型转换等。该据中无无用据,故只需据类型转换: ``` # 据类型转换 data.iloc[:,2:]=data.iloc[:,2:].astype('float64') ``` 接着,按照品种名称对据进行分组,并分别绘制出密度图和散点图以观察据分布情况: ``` # 分组 data1=data.groupby('品种') # 绘制密度图 for i in data1: sns.distplot(i[1]['密度'],hist=False,rug=True,label=i[0]) # 绘制散点图 plt.scatter(data['密度'],data['含糖率'],c=data['品种'].astype('category').cat.codes) plt.show() ``` 绘制的结果如下图所示: ![image-20210318161715841](https://cdn.jsdelivr.net/gh/107-world/img_cdn/img_a/image-20210318161715841.png) 通过观察据分布情况,可以考虑对密度和含糖率进行聚类分析,代码如下: ``` # 聚类 data2=data.iloc[:,2:] kmeans=KMeans(n_clusters=3,random_state=0).fit(data2) # 将聚类结果存储在dataframe中 result=pd.concat([data,pd.Series(kmeans.labels_,index=data.index)],axis=1) result.rename(columns={0:'聚类结果'},inplace=True) # 绘制聚类后的分布情况 plt.scatter(result['密度'],result['含糖率'],c=result['聚类结果'].astype('category').cat.codes) plt.show() ``` 通过绘制聚类后的分布情况,可以更直观地观察聚类结果,代码如下: ![image-20210318162328962](https://cdn.jsdelivr.net/gh/107-world/img_cdn/img_a/image-20210318162328962.png) 在本次西瓜品类分析中,我们使用K-means算法对西瓜的密度和含糖率进行聚类分析,将西瓜分为三个品类,并可视化显示各品类的分布情况。K-means算法的优点是简单易懂、计算速度快,适合处理大规模的据,但由于需要事先指定聚类量,对初始值的选择比较敏感,因此还需要对据进行比较准确的预处理和选择合适的初始值方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值