spark企业级电商分析平台项目实践(七)需求四分析与实现

前言

需求四:获取top10热门品类的活跃session

一、需求分析

上一章节中,获取到了top10热门商品,本章节,基于热门商品,分别获取到Top10热门品类中的Top10活跃Session

二、思路及步骤

在这里插入图片描述

三、实现

  • 声明需求四的主函数
def top10ActiveSession(sparkSession: SparkSession,
                        taskUUID: String,
                        top10Category: Array[(SortKey, String)],
                        sessionId2FilterActionRDD: RDD[(String, UserVisitAction)]) :Unit ={
    ...
}
  • 第一步:出所有点击过top10热门品类的action;有两种方法,从性能上,方法二更优
    1.方法一:jion的方式,需要shuffle
// 1. top10商品品类数据 转换cid作为key
val cid2CountInfoRDD = sparkSession.sparkContext.makeRDD(top10Category).map{
    case (sortKey, countInfo) =>
        val cid = StringUtils.getFieldFromConcatString(countInfo, "\\|", Constants.FIELD_CATEGORY_ID).toLong
        // 获取到top10商品的cid
        (cid, countInfo)
}
// 2. action数据 同样 转换cid作为key,进行后面的join
val cid2ActionRDD = sessionId2FilterActionRDD.map{
    case (sessionId, action) =>
        val cid = action.click_category_id
        // 获取到action数据的cid
        (cid, action)
}
// 3. join操作,获取点击过top10品类的action,获得符合条件的 (sessionId, action)
val sessionId2ActionRDD = cid2CountInfoRDD.join(cid2ActionRDD).map{
    case (cid, (countInfo, action)) =>
        val sessionId = action.session_id
        (sessionId, action)
}

2.方法二:将top10Category提取出所有cid作为一个array,通过对action数据进行filter操作,看其点击cid是否包含在在array里即可

// cidArray: Array[Long] 包含了top10的cid信息
val cidArray = top10Category.map{
    case (sortKey, countInfo) =>
        val cid = StringUtils.getFieldFromConcatString(countInfo, "\\|", Constants.FIELD_CATEGORY_ID).toLong
        cid
}
// 获得点击过top10品类的action数据RDD
val sessionId2ActionRDD = sessionId2FilterActionRDD.filter{
    case (sessionId, action) =>
        cidArray.contains(action.click_category_id)
}
  • 第二步:通过以上两种方法,获得获得点击过top10品类的action数据RDD后,开始统计每个session对top10品类的点击次数
// 按照sessionId进行聚合
val sessionId2GroupRDD = sessionId2ActionRDD.groupByKey()

// 遍历所有session的所有action,统计每个session对各品类的点击次数,维护一个map
val cid2SessionCountRDD = sessionId2GroupRDD.flatMap{
    case (sessionId, iterableAction) =>
        // 定义一个map用来存储各品类的点击次数
        val categoryCountMap = new mutable.HashMap[Long, Long]()
        // 遍历所有action
        for (action <- iterableAction){
            val cid = action.click_category_id
            if (!categoryCountMap.contains(cid))
                categoryCountMap += (cid -> 0)
            categoryCountMap.update(cid, categoryCountMap(cid)+1)
        }
    // 记录了一个session对于它所有点击过的品类的点击次数
    for ((cid, count) <- categoryCountMap)
        yield (cid, sessionId + "=" + count)
}

首先,根据sessionId对action进行聚合,获得每个session的全部action;然后,统计每个session对每个categoryId的点击次数count,并维护一个map<categoryId, count>来存储信息;最后,为了避免map中session信息的丢失,需要将map改为<categoryId, sessionN=count>的形式。如下图所示:
在这里插入图片描述

  • 第三步:聚合操作,获得每个categoryId对应的,点击过它的session的count
    上一步获得的cid2SessionCountRDD,其内部结构如下图:是由多个session的map<categoryId, session=count>组成的
    在这里插入图片描述
    为了统计每个categoryId的活跃点击session,需要对categoryId进行聚合操作,预期得到的数据如下图:
    在这里插入图片描述
// cid2SessionCountRDD: Map<cid, session=count> 对这个map按照cid进行groupbykey,可以获得每个cid的点击过它的session的点击次数count
val cid2GroupRDD = cid2SessionCountRDD.groupByKey()
  • 第四步:抽取每个categoryId(10个)的前十活跃点击session的count,一共100个
// top10SessionRDD: RDD[Top10Session]
val top10SessionRDD = cid2GroupRDD.flatMap{
    case (cid, iterableSessionCount) =>
        // 对每个cid的session按照count次数大小排序 sortWith(true)则item1放在前面
        // sortList: RDD[sessionCount]
        val sortList = iterableSessionCount.toList.sortWith((item1, item2) =>{
            item1.split("=")(1).toLong > item2.split("=")(1).toLong
        }).take(10)

        // top10Session: RDD[Top10Session]
        val top10Session = sortList.map{
            case item =>
                val sessionId = item.split("=")(0)
                val count = item.split("=")(1).toLong
                Top10Session(taskUUID, cid, sessionId, count)
        }

        top10Session
}
  • 第五步:转成dataframe,写入mysql
import sparkSession.implicits._
top10SessionRDD.toDF().write
        .format
项目Spark离线处理本项目来源于企业级电商网站的大数据统计分析平台,该平台以 Spark 框架为核心,对电商网站的日志进行离线和实时分析。 该大数据分析平台电商网站的各种用户行为(访问行为、购物行为、广告点击行为等)进行分析,根据平台统计出来的数据,辅助公司中的 PM(产品经理)、数据分析师以及管理人员分析现有产品的情况,并根据用户行为分析结果持续改进产品的设计,以及调整公司的战略和业务。最终达到用大数据技术来帮助提升公司的业绩、营业额以及市场占有率的目标。 本项目使用了 Spark 技术生态栈中最常用的三个技术框架,Spark Core、Spark SQL 和 Spark Streaming,进行离线计算和实时计算业务模块的开发。实现了包括用户访问 session 分析、页面单跳转化率统计、热门商品离线统计、广告流量实时统计 4 个业务模块。通过合理的将实际业务模块进行技术整合与改造,该项目几乎完全涵盖了 Spark Core、Spark SQL 和 Spark Streaming 这三个技术框架中大部分的功能点、知识点,学员对于 Spark 技术框架的理解将会在本项目中得到很大的提高。 项目Spark实时处理项目简介对于实时性要求高的应用,如用户即时详单查询,业务量监控等,需要应用实时处理架构项目场景对于实时要求高的应用、有对数据进行实时展示和查询需求项目技术分别使用canal和kafka搭建各自针对业务数据库和用户行为数据的实时数据采集系统,使用SparkStreaming搭建高吞吐的数据实时处理模块,选用ES作为最终的实时数据处理结果的存储位置,并从中获取数据进行展示,进一步降低响应时间。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值