功能大纲
1、按条件筛选session
2、聚合统计:统计出符合条件的session中,访问时长在1s~ 3s、4s~ 6s、7s~ 9s、10s~ 30s、30s~ 60s、1m~ 3m、3m~ 10m、10m~ 30m、30m以上各个范围内的session占比;访问步长在1~ 3、4~ 6、7~ 9、10~ 30、30~60、60以上各个范围内的session占比
3、在符合条件的session中,按照时间比例随机抽取1000个session
4、在符合条件的session中,获取点击、下单和支付数量排名前10的品类
5、对于排名前10的品类,分别获取其点击次数排名前10的session
1、按条件筛选session
- 搜索关键词用户
- 访问时间在某个时间段
- 年龄区间在某个范围
- 职业在某个范围
- 某个城市用户
第一个问题?筛选粒度
想要按条件筛选session ,筛选力度不同,比如搜索词、访问时间 ;还有基于用户基础信息进行筛选,年龄,性别,职业等
第二个问题?数据量很大,user_visit_action表 如果活跃量在千万级别的话 每天数据量至少5亿以上,在10亿左右
筛选粒度不同意,就会对所有数据进行全量扫描,全量扫描,数据太大,spark作业运行速度大幅度降低。 影响平台使用者体验
那么怎么办?数据聚合
session粒度的聚合,最基本筛选条件,比如时间范围,从hive表中提取数据,按照session_id进行聚合,聚合后的一条记录,就是一个用户的某个session在指定时间内的访问记录, 一个用户某个session时间段内访问记录,比如搜索过的关键词,点击过的品类id,session对应的userid关联的用户基础信息
聚合过后,针对session粒度的数据,按照指定筛选条件,进行数据筛选,筛选出来条件session粒度数据
2、统计session占比
- 访问时长在1s~ 3s、4s~ 6s、7s~ 9s、10s ~ 30s、30s ~ 60s、1m ~ 3m、3m~ 10m、10m~30m、30m以上各个范围内的session占比
-访问步长在1 ~ 3、4 ~ 6、7~ 9、1030、30~60、60以上各个范围内的session占比
访问时长
也就是说一个session对应的开始的action,到结束的action,之间的时间范围
访问步长
一个session执行期间内,依次点击过多少个页面
比如说,一次session,维持了1分钟,那么访问时长就是1m,然后在这1分钟内,点击了10个页面,那么session的访问步长,就是10.
比如说,符合第一步筛选出来的session的数量大概是有1000万个。那么里面,我们要计算出,访问时长在1s~ 3s内的session的数量,并除以符合条件的总session数量(比如1000万),比如是100万/1000万,那么1s~3s内的session占比就是10%。依次类推,这里说的统计,就是这个意思。
功能:,其实就是,可以让人从全局的角度看到,符合某些条件的用户群体,使用我们的产品的一些习惯。比如大多数人,到底是会在产品中停留多长时间,大多数人,会在一次使用产品的过程中,访问多少个页面。那么对于使用者来说,有一个全局和清晰的认识。
### 实际上也就是聚合统计
spark作业是分布式;
所以每个spark task在执行统计逻辑的时候,可能需要一个全局的变量,进行累加操作。比如访问时长在1~3s 的session数量, 初始为0,然后分布式处理所有session, 判断每个session的访问时长,如果是1s ~ 3s内的话,那么就给 1-3s的session技术器, 累加1
就是Accumulator变量;那么就会导致需要很多个Accumulator变量需要很多 维护复杂
自定义Accumulator,来实现复杂的分布式计算,用一个Accumulator,计算所有指标。
3、在符合条件的session中,按照时间随机抽取1000个session
随机抽取本身是很简单的,但是按照时间比例,就很复杂了。比如说,这一天总共有1000万的session。那么我现在总共要从这1000万session中,随机抽取出来1000个session。但是这个随机不是那么简单的。需要做到如下几点要求:首先,如果这一天的12:00~13:00的session数量是100万,那么这个小时的session占比就是1/10,那么这个小时中的100万的session,我们就要抽取1/10 * 1000 = 100个。然后再从这个小时的100万session中,随机抽取出100个session。以此类推,其他小时的抽取也是这样做。
功能:可以让使用者,能够对于符合条件的session,按照时间比例均匀的随机采样出1000个session,然后观察每个session具体的点击流/行为,比如先进入了首页、然后点击了食品品类、然后点击了雨润火腿肠商品、然后搜索了火腿肠罐头的关键词、接着对王中王火腿肠下了订单、最后对订单做了支付。
具体来说就是使用spark的各种算子,countByKey,groupByKey ,map
按时间比例随机均匀采样抽取算法
4、在符合条件的session中,获取点击、下单和支付数量排名前10的品类
对于session 可能对商品进行点击,下单和支付等等
获取session 点击、下单 和支付数量排名前10的最热门的品类;
将session按照点击、下单和支付三个属性进行排序。获取top10
功能:符合条件的session,最感兴趣的商品是什么种类。可以让不同层次、不同类型的用户的心理和喜好。
实现
使用Spark的自定义key二次排序算法技术,来实现所有品类,按照三个字段,点击数量,下单数量,支付数量一次排序
clickCount,orderCout,payCount
5、对于排名前10的品类,分别获取其点击次数排名前10的session
对于top10的品类,每一个获取点击次数排名前10的session
功能:对某个用户群体最感兴趣的品类,各个品类最感兴趣最典型的用户session行为
实现
也就是Spark的分组TopN算法来实现排序,对排名前10的品类对应数据,按照品类id进行分组,求出每组点击量前10session
技术实现
web项目+spark+mysql
写在后面的话
- 通过底层数据聚合,减少spark作业处理数据量,从而提升spark作业性能
- 自定义Accumulator实现复杂分布式计算基数
- Spark按时间比例随机抽取算法
- Spark自定义key二次排序
- Spark分组去TopN算法
- 通过Spark各种功能技术点,进行聚合、采样、排序、TopN业务实现