会话统计_得出结果|学习笔记

简介: 快速学习会话统计_得出结果

开发者学堂课程【大数据 Spark2020版(知识精讲与实战演练)第四阶段 会话统计_得出结果】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/691/detail/12124


会话统计_得出结果


已获取行政区的信息之后,整个功能并没有结束,最终目的在行政区统计每一个行政区平均等客时间。

会话统计,统计每个行政区的行程

1.目标和步骤

(1)目标

掌握在 spark 如何进行会话统计

统计每个行政区的所有行程,查看每个行政区平均等候客人的时间

掌握会话统计的方式方法

(2)步骤

会话统计的概念

功能实现

2.会话统计的概念

(1)需求分析

需求

统计每个行政区的平均等客时间

需求可以拆分为如下几个步骤

按照行政区分组统计每个行政区的平均等客时间,要按照行政区分组

在每一个行政区中,找到同一个出租车司机的先后两次订单,质就是再次针对司机的证件号再次分组

求出这两次订单的下车时间和上车时间只差,便是等待客人的时间

针对一个行政区,求得这个时间的平均数

多次分组问题:分组效率太低

分组的效率相对较低

·分组是 Shuffle

·两次分组(第一次按照行政区分组,第二次在行政区内按照出租车司机进行分组,分组后按照出租车先后顺序进行排序),包括后续的计算,相对比较复杂

简化效率,提高执行流程

解决方案:分区后在分区中排序

按照某一个字段进行分区,修改分区数,修改分区数分组是 Shuffle,相对性能较高,不需要多次进行 groupBy

按照  License(源数据)重新分区,如此一来,所有相同的司机的数据就会在同一个分区中

计算分区中连续两条数据的时间差

修改分区数,性能提高

image.png

按照 license 列进行分区,两个相同 license 数据,一定在一个 partition 中,针对数据进行简单排序,求出时间差值,完成功能第一条数据的 dropOffTime 减去第一天数据的 pickUpTime

无论是刚才的多次分组,还是后续的分区,都是要找到每个司机的会话,通过会话来完成功能,也叫做会话分析

3.功能实现

(1)步骤

过滤掉没有经纬度的数据(数据没有经纬度无法进行计算)

按照 License 重新分区并按照 License 和 pickUpTime 排序

求得每个司机的下车和下次上车的时间差

求得每个行政区得统计数据

过滤掉没有经纬度的数据,TaxiClean 是清理过的数据集,where 一下"dropOffX != 0有些麻烦,写入字符串的形式,conditionExpr = "dropOffX != 0 and drop0ffY != 0 and pickUpX != 0 and pickUpY != 0",通过语句表达式直接完成对应功能,过滤掉没有经纬度的数据,进行会话分析,按照 license 列进行分区,.repartition 指定列名 license,将所有同一个出租车的数据分发到一个分区上要进行排序,找到其间的关系,sortWithPartitions 在分区内进行排序,按照 license 和时间进行排序,排序后可以进行后续功能,获取到每一条会话,求得先后数据的时间差,经过 repartition 后所以 license 相同的数据分配到同一个分区,对其进行排序,如果有六个窗口并排,移动到某两个窗口都要进行一次数据计算,针对一个分区。

mapPartitions 找到所有数据,时间差要找到trips,trips 是分区所有的数据,有一个 sliding 方法,给定2表示找到两个长度的窗口,没隔1进行一次移动,sliding 过后得到相应的分布数据,进行过滤,过滤单数的一些数据,如最终一个数据等,找到size,判断与2的关系,继续过滤,一个出租车的所有数据全部分发到一个分区中,分区不只有一个出租车的数据,判断两条数据的对,找到p.head.license=p.last,license,通过 filter 找到不会出现两条数据中一条数据是某一个出租车的,另一条数据是另外一个出租车的,

image.png

出租车先后的对处理完成,命名 viter,求得时间差,定义一个方法 boroughDuration,返回源组,源组就是行政区的名字和等客时间,得到行政区,称为 boroughLookUp,boroughLookUp 是生成 UDF 的函数,不直接使用 UDF,直接使用 boroughLookUp 进行操作,得到 boroughLookUp 后,找到 dropOffX 和 dropOff Y,求得行政区名字,进行 duration 计算,通过后者 pickUpTime 减去 dropUpTime,求得差值,除以1000,将毫秒制去掉,更改时间单位。

找到 borough 行政区的名字和 duration 时间差,拿到各种对,调用 boroughDuration,传入 viter

Viter 是键值对,是一个数组、集合,转为 borough,duration 形式,boroughDuration(p.head, p.last),都变成 borough,duration 形式,第一列是 borough,第二列是 duration,改变数据集的结构需要声明第一列名字borough行政区名字,第二列 seconds 差值时间,获取 boroughDuration 集合,通过集合计算,where seconds 大于0,对行政区进行 groupBy,求得 agg,求得平均数与标准差

//8.1.过滤没有经纬度的数据

//8.2.会话分析

val sessions=taxiclean.where( conditionExpr = "dropOffX != 0 and drop0ffY != 0 and pickUpX != 0 and pickUpY != 0")

.repartition( partitionExprs = "license)

.sortwithinPartitions( sortExprs = "license,"pickUpTime)

//8.3.求得时间差

def boroughDuration(t1: Trip, t2: Trip): (string,Long) = {

val borough = boroughLookUp(t1.dropOffX,t1.dropoffY)

val duration = (t2.pickupTime - t1.dropoffTime) / 1e8e( borough,duration)

}

val boroughtDuration = sessions.mapPartitions(trips => {

val viter = trips.sliding(2)

.filter(_.size == 2)

.filter(p => p.head.license == p.last.license)

viter.map(p => boroughDuration(p.head, p.last))

}).toDF( colNames = "borough", "seconds")

boroughtDuration.where( conditionExpr = "seconds > e")

.groupBy( col1 = "borough")

.agg(avg( " seconds), stddev( 'seconds))

.show()

项目结束,最终目的地集合求出,运行数据集

image.png

数据集结果相对来说不太准确,有数据缺失,需要用完整的数据计算。

相关文章
|
5月前
|
存储 编解码 前端开发
会话跟踪技术
会话跟踪技术
41 2
|
SQL 监控 IDE
PostgreSQL监控1统计进程和统计信息的解读|学习笔记(一)
快速学习PostgreSQL监控1统计进程和统计信息的解读
610 0
PostgreSQL监控1统计进程和统计信息的解读|学习笔记(一)
|
SQL 缓存 监控
PostgreSQL 监控1统计进程和统计信息的解读|学习笔记(二)
快速学习PostgreSQL 监控1统计进程和统计信息的解读
428 0
PostgreSQL 监控1统计进程和统计信息的解读|学习笔记(二)
|
负载均衡 网络协议 开发者
配置会话保持|学习笔记
快速学习配置会话保持
400 0
配置会话保持|学习笔记
|
Oracle 关系型数据库
10G自动收集统计信息修改
10G自动收集统计信息修改
116 0
10G自动收集统计信息修改
|
机器学习/深度学习 Shell TensorFlow
会话的介绍|学习笔记
快速学习会话的介绍
107 0