Spark项目模拟——航班飞行网图分析
文章目录
- Spark项目模拟——航班飞行网图分析
- 需求描述
- 数据准备
- 需求思路整理
- 代码实现
- 总结
- 机场数量:
- 航线数量:
- 最大的边属性:
- 哪个机场到达航班最多:
- 找出最重要的飞行航线:
- 找出最便宜的飞行航线:
Spark项目模拟——航班飞行网图分析
需求描述
数据准备
数据文件一份,如下:
文件格式为CSV,字段之间分隔符为“,”
列依次为:#日、周#、航空公司、飞机注册号、航班号、起飞机场编号、起飞机场、到达机场编号、到达机场、预计起飞时间(时分)、起飞时间、起飞延迟(分钟)、到达预计时间、到达时间、到达延迟(分钟)、预计飞行时间、飞行距离
需求思路整理
创建属性图Graph[VD,ED]
1、装载CSV为RDD,每个机场作为顶点。关键字段:起飞机场编号、起飞机场、到达机场编号、到达机场、飞行距离
2、初始化顶点集airports:RDD[(VertexId,String)],顶点属性为机场名称
3、初始化边集lines:RDD[Edge],边属性为飞行距离
代码实现
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.types._
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{SparkSession, types}
import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.StructTypeobject FlightDemo {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setAppName("etldemo").setMaster("local[*]")val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()val sc: SparkContext = spark.sparkContextimport spark.implicits._
//加载文件val flightRDD: RDD[String] = sc.textFile("in/flight.csv")
// flightRDD.collect().foreach(println)val airPort: RDD[(VertexId, String)] = flightRDD.map(x => x.split(",")).flatMap(x => Array((x(5).toLong, x(6)), (x(7).toLong, x(8)))).distinct()
// airPort.collect().foreach(println)
// println(airPort.count()) //机场数量val lines: RDD[Edge[PartitionID]] = flightRDD.map(x => x.split(",")) //(起飞机场编号,降落机场编号,飞行距离).map(x => (x(5).toLong, x(7).toLong, x(16).toInt)).distinct().map(x => Edge(x._1, x._2, x._3))
// lines.collect().foreach(println)
// println(lines.count())val graph = Graph(airPort,lines)
// graph.triplets.collect().foreach(println)//机场数量val numvertices: VertexId = graph.numVerticesprintln("机场数量"+numvertices)//航线数量val numedges: VertexId = graph.numEdgesprintln("航线数量"+numedges)//计算最长的飞行航线val rdd1: RDD[EdgeTriplet[String, PartitionID]] = graph.triplets.sortBy(x=>x.attr,false)val str: Array[String] = rdd1.map(triplet => triplet.srcAttr + " " + triplet.dstAttr + " 距离 :" + triplet.attr).take(3)
// str.foreach(println)//找出降落繁忙的机场val indegrees: VertexRDD[PartitionID] = graph.inDegreesval busyAirPort: (VertexId, PartitionID) = indegrees.sortBy(x=>x._2,false).take(1)(0)
// println(busyAirPort)//找出起飞繁忙的机场val outdegrees: VertexRDD[PartitionID] = graph.outDegreesval busyinAirPort: (VertexId, PartitionID) = outdegrees.sortBy(x=>x._2,false).take(1)(0)
// println(busyinAirPort)//找出最重要的飞行航线val vertices: VertexRDD[Double] = graph.pageRank(0.05).vertices
// vertices.collect().foreach(println)
// vertices.sortBy(x=>x._2).collect().foreach(println)//找出最便宜的飞行航线val value: RDD[(VertexId, String)] = airPort.sample(false,1.0/airPort.count(),1)val source_id=13930.toLongval srcAirPortName =value.first()._2val srcAirPortId= value.first()._1println(source_id,srcAirPortId,srcAirPortName)val init_graph: Graph[Double, Double] = graph.mapVertices((id, value) => {if (id == srcAirPortId) 0else Double.PositiveInfinity}).mapEdges(e=> 180 + 0.15*e.attr.toDouble)val pregel_graph: Graph[Double, Double] = init_graph.pregel(Double.PositiveInfinity,Int.MaxValue,EdgeDirection.Out)((id, dist, new_dist) => math.min(dist, new_dist),triple => {if (triple.attr + triple.srcAttr < triple.dstAttr)Iterator((triple.dstId, triple.attr + triple.srcAttr))elseIterator.empty},(dist, new_dist) => math.min(dist, new_dist))pregel_graph.triplets.collect().foreach(println)//((16218,906.15),(12892,748.05),215.55)// 初始机场13296 到 16218 最低费用为 906.15//初始机场 13296 到12892 最低费用为748.05//机场16218 到12892 最低费用为 215.55//得到 初始机场到 另一个机场的 最少费用
// pregel_graph.vertices.collect().foreach(println)//最便宜的机票
// val tuples: Array[(VertexId, Double)] = pregel_graph.vertices.sortBy(x=>x._2).take(3)
// println(tuples.toList)//List((13296,0.0), (12953,209.25), (11618,211.35))//13296 为初始机场,所以费用为0}
}
总结
实现需求过程中使用了以下函数:
Spark GraphX APIvertices、edges、triplets、numEdges、numVerticesinDegrees、outDegrees、degreesmapVertices、mapEdges、mapTripletsSpark GraphX PageRankSpark GraphX Pregel
机场数量:
求顶点个数:Graph.numVertices
航线数量:
求边的个数:Graph.numEdges
最大的边属性:
对triplets按飞行距离排序(降序)并取第一个
哪个机场到达航班最多:
计算顶点的入度并排序
找出最重要的飞行航线:
PageRank
收敛误差:0.05
找出最便宜的飞行航线:
定价模型:
price = 180.0 + distance * 0.15
SSSP问题 :
从初始指定的源点到达任意点的最短距离
pregel:
1、初始化源点(0)与其它顶点(Double.PositiveInfinity)
2、初始消息(Double.PositiveInfinity)
3、vprog函数计算最小值
4、sendMsg函数计算进行是否下一个迭代
5、mergeMsg函数合并接受的消息,取最小值
Spark项目模拟——航班飞行网图分析相关推荐
- 项目实战 航班飞行网图分析
数据资料提取的地点 链接:https://pan.baidu.com/s/1WZlECyIjDyMwdVeyY2Gfqg 提取码:1111 训练的技能点 Spark GraphX API Spar ...
- Spark GraphX 中的PageRank算法、pregel函数、航班飞行网图分析
PageRank算法 PageRank算法原理剖析及Spark实现 - 简书 (jianshu.com) import org.apache.spark.SparkContext import org ...
- Spark GraphX-航班飞行网图分析
文章目录 1.如下图所示的航班表,解决以下问题: 2.思路如下: 3.代码如下: 4.代码如下: 1.如下图所示的航班表,解决以下问题: 统计航班飞行网图中机场的数量 统计航班飞行网图中航线的数量 计 ...
- sparkGraphx-航班飞行网图分析
文章目录 数据格式 构建航班飞行网图 数据格式 文件格式为CSV,字段之间分隔符为"," 依次为:#日.周#.航空公司.飞机注册号.航班号.起飞机场编号.起飞机场.到达机场编号.到 ...
- 【Spark GraphX】社交网图分析
目录 一.数据 1.数据关系图 2. 数据说明 3.顶点表 4.边表 二.需求 三.需求实现 1.构造fans网图 2.找出年龄大于30岁的顶点 3.找出边属性大于5的边 4.将每个顶点的年龄+20 ...
- Spark项目实战—电商用户行为分析
文章目录 一.[SparkCore篇]项目实战-电商用户行为分析 前言:数据准备 1.数据规则如下: 2.详细字段说明: 3.样例类 (一)需求1:TOP10热门品类 1.需求说明 2.代码实现方案1 ...
- Spark项目之电商用户行为分析大数据平台之(三)大数据集群的搭建
Zookeeper集群搭建 http://www.cnblogs.com/qingyunzong/p/8619184.html Hadoop集群搭建 http://www.cnblogs.com/qi ...
- 一文了解 NebulaGraph 上的 Spark 项目
最近我试着搭建了方便大家一键试玩的 Nebula Graph 中的Spark 相关的项目,今天就把它们整理成文分享给大家.而且,我趟出来了 PySpark 下的 Nebula Spark Connec ...
- 手把手教你做出数据可视化项目(四)动态模拟航班飞行路线
数据可视化前言:https://blog.csdn.net/diviner_s/article/details/115933789 项目最终效果图: 此篇博客为自己学习pink老师的课后完成的项目的总 ...
最新文章
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
- 防止在iOS设备中的Safari将数字识别为电话号码
- sencha touch list(列表)、 store(数据源)、model(模型)详解
- 这个比肩ImageNet的数据集遭MIT紧急下架,原因令人愤怒
- UA MATH566 统计理论1 充分统计量例题答案1
- 收文处理和发文处理的环节_公文处理,如何提速增效
- C# 连蒙带骗不知所以然的搞定USB下位机读写
- 机器学习的gridSearchCV调参
- 到底什么方法 训练1000个样本,就能完成400万条评论分类!
- 【BZOJ3505】[Cqoi2014]数三角形 组合数
- 阿里巴巴国际站 | 如何做数据分析?
- PumpkinRaising靶机渗透
- has leaked IntentReceiver ...that was originally registerd here.Are you missing a call to unregister
- 数字功放和模拟功放有哪些区别
- UEFI模式创建Grub2引导ubuntu16.04和windows10,并安装Linux Nvidia驱动
- 德佑地产房产经纪人区域总监访谈:精耕,业精于勤
- IIC协议下的OLED屏幕的三种寻址方式
- i7 9750h和r7 5800h差距大不大
- Mac--键盘输入的技巧
- 百度地图多点路线规划_通勤出行该选谁?高德、百度地图对比,看看谁是上班最优选...
热门文章
- nginx -rtmp多码率,动态码率二级m3u8适应
- 打赢防“疫”战,云服务商都做了什么……
- 服务器虚拟机的c盘怎么加,xp虚拟机c盘怎么扩容
- CF Card Reader Test市面CF读卡器不完全测评
- linux上创建loopback接口,在python中的特定接口的linux loopback接口
- 关于男女交往的换位思考
- 父母不会用智能机?这几个功能可要教会他们
- 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc
- 【SQL注入技巧拓展】————13、我的WafBypass之道(SQL注入篇)
- 【C++】DFS——计算土地上水洼的数量