企业spark案例 —— 出租车轨迹分析(2)
任务描述
本关任务:使用SparkSQL完成数据分析。
相关知识
为了完成本关任务,你需要掌握:如何使用SparkSQL进行数据分析
FastJson 简述
JSON 协议使用方便,越来越流行,JSON 的处理器有很多,这里我介绍一下 FastJson,FastJson 是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,Github地址:FastJson 。
FastJson 优点
FastJson 数度快,无论序列化和反序列化,都是当之无愧的fast功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)零依赖(没有依赖其它任何类库)
FastJson 简单使用
json字符串:
String JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";
JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
String studentName = jsonObject.getString("studentName");
String studentAge = jsonObject.getString("studentAge");
System.out.println(studentName + ":" + studentAge);
实际输出:
lily:12
json数组:
String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";//方法一
JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
System.out.println("studentName: " + jsonObject.getString("studentName") + ":" + " studentAge: " + jsonObject.getInteger("studentAge"));
}
//方法二
int size = jsonArray.size();
for (int i = 0; i < size; i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
System.out.println("studentName: " + jsonObject.getString("studentName") + ":" + " studentAge: " + jsonObject.getInteger("studentAge"));}
实际输出:
studentName: lily: studentAge: 12
studentName: lucy: studentAge: 15
studentName: lily: studentAge: 12
studentName: lucy: studentAge: 15
编程要求
字段说明
字段 描述
TRIP_ID 每个行程的唯一标识符
CALL_TYPE 它标识用于请求此服务的方式。它可能包含三个可能值中的一个:A:使用滴滴打车、B:万顺叫车、C:曹操专车
ORIGIN_CALL 它包含每个电话号码的唯一标识符,用于至少要求一个服务。如果CALL_TYPE =‘A’,它会识别旅行的客户。否则,它假定为NULL值
ORIGIN_STAND 它包含出租车站的唯一标识符。如果CALL_TYPE =‘B’,它确定行程的起点。否则,它假定为NULL值
TAXI_ID 它包含执行每次旅行的出租车司机的唯一标识符
TIMESTAMP Unix时间戳(以秒为单位)。它确定了旅行的开始
POLYLINE 它包含一个映射为字符串的GPS坐标列表(即WGS84格式)。字符串的开头和结尾用括号标识(分别是[和])。每对坐标也用与[LONGITUDE,LATITUDE]相同的括号标识。该列表包含每15秒行程的一对坐标。最后一个列表项对应于旅程的目的地,而第一个列表项表示其开始
在右侧编辑器补充代码,完成以下需求:
将时间戳转换成时间,例如将 1560239495 转换成 2019-6-11
TRIP_ID CALL_TYPE ORIGIN_CALL TAXI_ID ORIGIN_STAND POLYLINE TIME
1372636858620000589 C null 20000589 null [[-8.618643,41.14… 2013-07-01
1372637303620000596 B null 20000596 7 [[-8.639847,41.15… 2013-07-01
将 POLYLINE 字段,分离出 startLocation , endLocation 两个字段
TRIP_ID CALL_TYPE ORIGIN_CALL TAXI_ID ORIGIN_STAND POLYLINE TIME startLocation endLocation
1372636858620000589 C null 20000589 null [[-8.618643,41.14… 2013-07-01 [-8.618643,41.141… [-8.630838,41.154…
1372637303620000596 B null 20000596 7 [[-8.639847,41.15… 2013-07-01 [-8.639847,41.159… [-8.66574,41.170671]
计算时长,行程的总行程时间定义为(点数-1)×15秒,例如,POLYLINE 中具有101个数据点的行程具有(101-1)* 15 = 1500秒的长度
TRIP_ID CALL_TYPE ORIGIN_CALL TAXI_ID ORIGIN_STAND POLYLINE TIME startLocation endLocation timeLen
1372636858620000589 C null 20000589 null [[-8.618643,41.14… 2013-07-01 [-8.618643,41.141… [-8.630838,41.154… 330
1372637303620000596 B null 20000596 7 [[-8.639847,41.15… 2013-07-01 [-8.639847,41.159… [-8.66574,41.170671] 270
统计每天各种呼叫类型的数量并以 CALL_TYPE,TIME 升序排序
CALL_TYPE TIME num
A 2013-07-01 1147
A 2013-07-02 993
A 2013-07-03 189
B 2013-07-01 2462
B 2013-07-02 2355
B 2013-07-03 340
C 2013-07-01 1119
C 2013-07-02 1191
C 2013-07-03 204
特别说明:表格为预期输出的一部分,使用 DataFrame.show() 时,请保证自身编写的字段与预期字段名称一致、顺序一致。本案例的 CSV 文件是以 \t 进行字段分隔,文件路径为 /root/data2.csv
测试说明
平台将对你编写的代码进行评测:
预期输出内容较长,请在测试集中进行查看。
开始你的任务吧,祝你成功!
参考代码
import com.alibaba.fastjson.JSON
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StringTypeobject Step2 {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().appName("Step1").master("local").getOrCreate()spark.sparkContext.setLogLevel("error")/**********begin**********/val frame = spark.read.option("header", true).option("delimiter", "\t").csv("/root/data2.csv")frame.createTempView("data")//1.将时间戳转换成时间spark.sql("select TRIP_ID,CALL_TYPE,ORIGIN_CALL,TAXI_ID,ORIGIN_STAND,POLYLINE, from_unixtime(TIMESTAMP,'yyyy-MM-dd') as TIME from data").createTempView("data2")spark.sql("select * from data2").show()//2.将POLYLINE字段,分离出startLocation,endLocation 两个字段spark.udf.register("startLocation", (x: String) => {val arr = JSON.parseArray(x)arr.get(0).toString})spark.udf.register("endLocation", (x: String) => {val arr = JSON.parseArray(x)arr.get(arr.size() - 1).toString})spark.sql("""|select TRIP_ID,CALL_TYPE,ORIGIN_CALL,TAXI_ID,ORIGIN_STAND,POLYLINE,TIME,startLocation(POLYLINE) as startLocation,endLocation(POLYLINE) as endLocation from data2""".stripMargin).createTempView("data3")spark.sql("select * from data3").show()//3.计算时长,行程的总行程时间定义为(点数-1)×15秒。// 例如,POLYLINE中具有101个数据点的行程具有(101-1)* 15 = 1500秒的长度spark.udf.register("timeLen", (x: String) => {(JSON.parseArray(x).size() - 1) * 15})spark.sql("""|select TRIP_ID,CALL_TYPE,ORIGIN_CALL,TAXI_ID,ORIGIN_STAND,POLYLINE,TIME,startLocation(POLYLINE) as startLocation,endLocation(POLYLINE) as endLocation,timeLen(POLYLINE) as timeLen from data3""".stripMargin).createTempView("data4")spark.sql("select * from data4").show()//4.统计每天各种呼叫类型的数量并以CALL_TYPE,TIME升序排序spark.sql("""|select CALL_TYPE ,TIME,count(1) as num from data4 group by TIME,CALL_TYPE order by CALL_TYPE,TIME""".stripMargin).show()/**********end**********/spark.stop()}
}
企业spark案例 —— 出租车轨迹分析(2)相关推荐
- spark如何进行聚类可视化_基于Spark的出租车轨迹处理与可视化平台
由于城市化进程加剧以及汽车数量增加, 城市交通问题日益严重[, 通过分析各种空间数据解决交通问题是当前研究的热点. 出租车提供广泛且灵活的交通运输服务, 是城市交通的重要组成部分. 出租车轨迹数据记录 ...
- 上半年企业营销案例总结
中秋.国庆双节的临近,企业各类大大小小的市场营销活动也正在如火如荼的进行中.小编为了能够帮助大家防止营销翻车,以及借鉴参考,盘点了今年以来一些网络热度指数高的企业营销案例进行了分析,并整合成了一份20 ...
- 大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例
大数据技术之_19_Spark学习_07 第1章 Spark 性能优化 1.1 调优基本原则 1.1.1 基本概念和原则 1.1.2 性能监控方式 1.1.3 调优要点 1.2 数据倾斜优化 1.2. ...
- Mysql出租车轨迹的分析_一种基于出租车轨迹数据的交通出行共现现象的可视化分析方法与流程...
本发明涉及交通数据可视化领域,尤其涉及一种基于出租车轨迹数据的交通出行共现现象的可视化分析方法. 背景技术: :城市中人类移动规律中的共现现象是指来自两个区域的人们在同一个时间段内访问同一个城市区域. ...
- 【PySpark】流处理案例实战:分析纽约市出租车载客信息
Spark 两个用于流处理的组件--Spark Streaming 和 Structured Streaming.其中 Spark Streaming 是 Spark 2.0 版本前的的流处理库,在 ...
- 2021年大数据Spark(二十一):Spark Core案例-SogouQ日志分析
目录 案例-SogouQ日志分析 业务需求 准备工作 HanLP 中文分词 样例类 SogouRecord 业务实现 搜索关键词统计 用户搜索点击统计 搜索时 ...
- spark企业经典案例之手机app流量统计
spark企业经典案例之手机app流量统计,本课程是基于企业真实项目案例中的一个模块为背景讲解,此业务涉及spark统计,然后通过phpweb进行读取数据,最终通过手机端展示,根据公司案例抽取出来的模 ...
- 大数据Spark(二十一):Spark Core案例-SogouQ日志分析
文章目录 案例-SogouQ日志分析 业务需求 准备工作 HanLP 中文分词
- 推荐系统从入门到 Spark 案例实践
课程介绍 随着移动互联网的高速发展,互联网所承载的信息呈爆炸式增长,而我们所能接触的信息量也急速增长,并且随着移动互联网的进一步发展,用户时间高度碎片化,如何在最短的时间内,快速抓住用户焦点.提升产品 ...
最新文章
- python窗口化编程_python程序的窗口化
- (转)Git详解之三:Git分支
- 201673020127 词频统计软件项目报告
- php4.3.x 5.2.x,XDEBUG for PHP 5.3.0
- 网上购物软件的测试计划,网上购物平台购物测试计划书
- java求二阶微积分方程特解_Scipy:实现微分方程的两种方法:两种不同的解决方案:回答...
- PDO NOsuch file 将DNHOST修改
- [2018.10.15 T1] 或
- linux查看445端口状态,linux和Windows如何查看端口占用情况
- 清北级别,补助丰厚,这样的中科院信工所你心动了吗?
- 联想正在美丽的海南岛搞个大活动,速看
- UNIX时间及相关概念
- 【论文翻译】Flow-Guided Feature Aggregation for Video Object Detection
- Spamhaus -影响最大的RBL(实时黑名单列表)服务提供商,非营利性组织
- mac pdf去水印_PDF水印工具Mac版
- 东方博宜OJ 1265 - 【入门】爱因斯坦的数学题
- 搞笑文章|如何瘫痪你的电脑
- 2017年初中计算机课改计划,初中2017年计算机教学工作计划(2)
- 中秋元宵猜灯谜_猜字谜微信小程序源码
- kafka java api 入数据报错:Error: MESSAGE_TOO_LARGE