136.Spark大型电商项目-用户活跃度分析模块-统计最近一个周期相对上一个周期消费金额增长最多的10个用户

目录

代码

运行结果


本篇文章记录获取指定时间范围内消费金额增长最多的10个用户,使用SparkSession来分析数据。

代码

UserActiveDegreeAnalyze.scala 

package graduation.scala.spark

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

/**
  * FileName: UserActiveDegreeAnalyze
  * Author:   hadoop
  * Email:    3165845957@qq.com
  * Date:     19-8-4 下午11:31
  * Description:
  *
  * 用户活跃度分析
  *
  * 我们这次项目课程的升级,也跟spark从入门到精通的升级采取同步,采用scala+eclipse的方式来开发
  *
  * 我个人而言,还是觉得应该用java去开发spark作业,因为hadoop是最重要的大数据引擎,hadoop mapreduce、hbase,全都是java
  * 整个公司的编程语言技术栈越简单越好,降低人员的招聘和培养的成本
  *
  * 但是由于市面上,现在大部分的公司,做spark都是采取一种,spark用scala开发,所以开发spark作业也用scala
  * 课程为了跟市场保持同步,后面就随便采取scala来开发了
  *
  */
object UserActiveDegreeAnalyze {

  case class UserActionLog(logId: Long, userId: Long, actionTime: String, actionType: Long, purchaseMoney: Double)
  case class UserActionLogVO(logId: Long, userId: Long, actionValue: Long)
  case class UserActionLogWithPurchaseMoneyVO(logId: Long, userId: Long, purchaseMoney: Double)

  def main(args: Array[String]) {
    // 如果是按照课程之前的模块,或者整套交互式分析系统的架构,应该先从mysql中提取用户指定的参数(java web系统提供界面供用户选择,然后java web系统将参数写入mysql中)
    // 但是这里已经讲了,之前的环境已经没有了,所以本次升级从简
    // 我们就直接定义一个日期范围,来模拟获取了参数
    val startDate = "2019-08-01";
    val endDate = "2019-09-01";

    // 开始写代码
    // spark 2.0具体开发的细节和讲解,全部在从入门到精通中,这里不多说了,直接写代码
    // 要不然如果没有看过从入门到精通的话,就自己去上网查spark 2.0的入门资料
    val conf  = new SparkConf().setAppName("UserActiveDegreeAnalyze").setMaster("local[2]")
    /*val spark = SparkSession
      .builder()
      .appName("UserActiveDegreeAnalyze")
      .master("local")
      .config("spark.sql.warehouse.dir", "D:\\test\\spark\\mall\\spark-warehouse")
      .getOrCreate()*/
    val  spark = SparkSession.builder().config(conf).getOrCreate()
    val sc = spark.sparkContext
    // 导入spark的隐式转换
    import spark.implicits._
    // 导入spark sql的functions
    import org.apache.spark.sql.functions._

    val  dataPath:String ="/home/hadoop/IdeaProjects/BigDataGraduationProject/log/"
    // 获取两份数据集
    val userBaseInfo = spark.read.json(dataPath+"user_base_info.json")
    val userActionLog = spark.read.json(dataPath+"user_action_log.json")

    //第四个功能:统计最近一个周期相对上一个周期消费金额增长最多的10个用户

    val userActionLogWithPurchaseMoneyInFirstPeriod = userActionLog.as[UserActionLog]
        .filter("actionTime >= '2019-10-01' and actionTime <= '2019-10-31' and actionType = 1")
        .map{ userActionLogEntry =>
          UserActionLogWithPurchaseMoneyVO(userActionLogEntry.logId, userActionLogEntry.userId,
            userActionLogEntry.purchaseMoney) }

    val userActionLogWithPurchaseMoneyInSecondPeriod = userActionLog.as[UserActionLog]
        .filter("actionTime >= '2019-09-01' and actionTime <= '2019-09-30' and actionType = 1")
        .map{ userActionLogEntry =>
          UserActionLogWithPurchaseMoneyVO(userActionLogEntry.logId, userActionLogEntry.userId,
            -userActionLogEntry.purchaseMoney) }

    val userActionLogWithPurchaseMoneyDS = userActionLogWithPurchaseMoneyInFirstPeriod.union(userActionLogWithPurchaseMoneyInSecondPeriod)

    userActionLogWithPurchaseMoneyDS
        .join(userBaseInfo, userActionLogWithPurchaseMoneyDS("userId") === userBaseInfo("userId"))
        .groupBy(userBaseInfo("userId"), userBaseInfo("username"))
        .agg(round(sum(userActionLogWithPurchaseMoneyDS("purchaseMoney")), 2).alias("purchaseMoneyIncr"))
        .sort($"purchaseMoneyIncr".desc)
        .limit(10)
        .show()

    sc.stop()
    spark.stop()

  }

}

运行结果

有时间再贴结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值