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

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

开发者学堂课程【大数据 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

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

相关文章
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1020 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1716 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
660 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
623 13
|
5天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
383 4