【原创】案例分享(3)用户行为分析--见证scala的强大

场景分析

用户行为分析应用的场景很多,像线上网站访问统计,线下客流分析(比如图像人脸识别、wifi探针等),比较核心的指标有几个:

PV | UV | SD | SC

指标说明:

PV(Page View):网站浏览量或者商场门店的访问量
UV(Unique Visitor):独立访客数,即去重后的人数
SD(Session Duration):单次会话停留时间
SC(Session Count):会话次数

用户行为分析的原始数据通常是一系列时间离散数据,比如网站访问记录:用户在一个时间点访问了一个网页,然后又在下个时间点访问了下个网页;

这些原始数据可以抽象为:

User | Timestamp | Target

即用户在什么时间点访问了什么目标;

统计PV、UV比较简单,但是在时间离散数据的基础上,要计算SD、SC这两个指标,常用的方式是设置过期时间阈值,如果用户两次访问的时间间隔超过阈值,则认为是两次Session;然后在一次Session的所有数据中取时间最早和最晚的数据来统计本次Session Duration;

统计示例

输入数据

(user1, 2018-12-01 01:00:00, t1)
(user1, 2018-12-01 01:01:30, t1)
(user1, 2018-12-01 01:06:00, t1)
(user1, 2018-12-01 01:20:00, t1)
(user1, 2018-12-01 01:24:00, t1)

可以统计出

PV=5,UV=1

过期时间阈值设置为5分钟,以上数据应该统计出来2次Session,分别是:

Session1: (2018-12-01 01:00:00 到 2018-12-01 01:06:00),Duration:6分钟
Session2: (2018-12-01 01:20:00 到 2018-12-01 01:24:00),Duration:4分钟

实际处理时还要数据乱序的问题,尤其是在实时计算中,你想好怎样做了吗?

Scala代码实现

下面给出scala实现,来见证scala的强大:

scala核心代码(一步foldLeft)

scala

  val expireInSecond = 300
  def mergeTimeArray(arr1 : ArrayBuffer[(Long, Long)], arr2 : ArrayBuffer[(Long, Long)]) : ArrayBuffer[(Long, Long)] = {
    if (arr1.head._1.equals(0l)) arr2
    else if (arr2.head._1.equals(0l)) arr1
    else (arr1 ++ arr2).sortBy(_._1).foldLeft(ArrayBuffer[(Long, Long)]())((result, item) => if (!result.isEmpty && result.last._2 + expireInSecond >= item._1) {result.update(result.length - 1, (result.last._1, math.max(result.last._2, item._2))); result} else result += item)
  }

spark核心代码(2步map 1步aggregateByKey)

scala

  /**
    * @param data (user, timestamp, target)
    * @return (user, target, session_count, session_duration)
    */
  def process(data : RDD[(String, Long, String)]) : RDD[(String, String, Integer, Double)] = {
    //((user, target), timestamp)
    data.map(item => ((item._1, item._3), item._2))
      //((user, target), Array[(startTime, endTime)])
      .aggregateByKey(ArrayBuffer((0l, 0l)))((result : ArrayBuffer[(Long, Long)], timestamp: Long) => mergeTimeArray(result, ArrayBuffer((timestamp, timestamp))), (result1 : ArrayBuffer[(Long, Long)], result2 : ArrayBuffer[(Long, Long)]) => mergeTimeArray(result1, result2))
      //(user, target, session_count, session_duration)
      .map(item => (item._1._1, item._1._2, item._2.length, item._2.foldLeft(0l)((result, item) => result + (item._2 - item._1)).toDouble / item._2.length))
  }

测试运行

  def main(args : Array[String]) : Unit = {
    val conf = new SparkConf().setAppName("UserAnalysis").setMaster("local[2]")
    val sc = new SparkContext(conf)
    val arr = Array(("user1", 1546054000l, "t1"), ("user1", 1546054090l, "t1"), ("user1", 1546054360l, "t1"), ("user1", 1546055200l, "t1"), ("user1", 1546055440l, "t1"))
    //(user, timestamp, target)
    val data : RDD[(String, Long, String)] = sc.parallelize(arr)
    this.process(data).foreach(println)
  }

输出

(user1,t1,2,300.0)

原文地址:https://www.cnblogs.com/barneywill/p/10193591.html

时间: 2024-08-30 09:42:54

【原创】案例分享(3)用户行为分析--见证scala的强大的相关文章

国内主流新一代用户行为分析系统选型过程分享

企业在选择用户行为分析工具时,大都不清楚如何选择适合自己业务的用户行为分析工具.笔者自己公司之前网站分析用百度统计APP分析用友盟,公司是做电商行业的,最近公司提出要精细化运营,用数据驱动业务增长,因此在10月份分别考察了国内做得比较出色的几家公司:数极客(阿里系).神策数据(百度系)和GrowingIO(LinkedIn系)三家公司的用户行为分析产品. 我在选型过程中将各家公司的功能和服务对比文档进行整理,从团队背景和产品定位.数据接入方式.定量分析功能.定性分析功能.二次开发与数据应用.服务

python案例:金融营销活动中欺诈用户行为分析

下午学习了python数据分析的应用案例---金融营销活动中欺诈用户行为分析.数据来源于DC竞赛数据:https://www.dcjingsai.com/common/cmpt/2018%E5%B9%B4%E7%94%9C%E6%A9%99%E9%87%91%E8%9E%8D%E6%9D%AF%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1%E5%A4%A7%E8%B5%9B_%E7%AB%9E%E8%B5%9B%E4%BF%A1%E6%81%AF.ht

mysql的"双1设置"-数据安全的关键参数(案例分享)

mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性的关键参数.下面从参数含义,性能,安全角度阐述两个参数为不同的值时对db 性能,数据的影响. 一.参数意义 innodb_flush_log_at_trx_commit如果innodb_flush_log_at_trx_commit设置为0:log buffer将每秒一次地写入log file中,并且log

【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表

提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图表等形式来动态显示数据,并为使用者提供浏览.打印.导出和分析的功能,可以用公式表示为: 报表 = 多样的布局 + 动态的数据 + 丰富的输出 报表通常包含以下组成部分: 报表首页:在报表的开始处,用来显示报表的标题.图形或说明性文字,每份报表只有一个报表首页. 页眉:用来显示报表中的字段名或对记录的

手机短视频应用 --用户行为分析和优化指南

根据趣拍云的数据统计分析,日前所有接入趣拍短视频SDK的App用户每天的鉴权请求平均在1300万次左右,见下图: 趣拍云目前监测到的App短视频拍摄应用,日均启动次数在131133次,日均拍摄完成次数40608次.见下图: 视频拍摄的应用比例大概为开启App次数的1%和0.3%.拍摄完成率大约为30%. 由于趣拍云并非监测所有接入的App的拍摄应用记录,因此实际的日均启动次数和完成拍摄次数会高于上面的数值.所以实际的短视频拍摄应用比例实际会超过1%和0.3%.   根据趣拍云监测的用户拍摄行为具

案例分享:数据库镜像故障转移失败

案例分享:数据库镜像故障转移失败 对于关键性数据库,我们配置了带有见证服务器的同步数据库镜像,来允许自动故障转移.一切运行正常,直到有一次数据中心的突然断电.数据库镜像执行了故障转移,但是运维反馈说应用程序挂起了.当我们手动切换回来,应用程序又正常工作.为什么应用程序没有也故障转移呢? 这是使用数据库镜像的合理的常见问题,像这样的生产应用失败,是因为在镜像部署后没有做故障转移测试.在失败的故障转移之后我们感到棘手. 为了避免生产应用停机,我们在测试环境复制了线上的镜像环境.在确认应用和数据库镜像

干货|如何做用户行为分析?  

在大数据时代,大数据分析非常重要,我们要理解大数据的核心价值,并掌握大数据分析方法.数据分析中,分析的最多的是用户,分析用户,分析的是用户行为和属性.今天智云通CRM系统小编要跟大家分享的是如何做用户行为分析. 一切不谈目的的分析的都是耍流氓.那我们就先来谈谈用户行为分析的目的都有哪些. 一.用户行为分析的目的 1)新产品迭代开发:通过分析用户行为,定位目标用户人群,通过用户画像等手段找到用户需求,开发新产品: 2)精准营销:产品已经有啦,是不是要分析分析用户的行为,找找我们的潜在用户,针对特定

Citrix XenDesktop中VDA无法注册到DDC案例分享(一)

[问题现象] 虚拟机无法注册到DDC [环境] VDA:Win7SP1Enterprise 32bit DDC:XenDesktop7.5 [问题分析及处理] 1. 登录未注册的VDA,重启"Citrix Desktop Service" 2. 检查Windows Eventlog中的Applicationr日志,发现以下错误 Error Details: Exception 'Cannot load Counter Name data because an invalid index

大数据实战:用户流量分析系统

本文是结合hadoop中的mapreduce来对用户数据进行分析,统计用户的手机号码.上行流量.下行流量.总流量的信息,同时可以按照总流量大小对用户进行分组排序等.是一个非常简洁易用的hadoop项目,主要用户进一步加强对MapReduce的理解及实际应用.文末提供源数据采集文件和系统源码. 本案例非常适合hadoop初级人员学习以及想入门大数据.云计算.数据分析等领域的朋友进行学习. 一.待分析的数据源 以下是一个待分析的文本文件,里面有非常多的用户浏览信息,保扩用户手机号码,上网时间,机器序