文章目录

  • 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项目模拟——航班飞行网图分析相关推荐

  1. 项目实战 航班飞行网图分析

    数据资料提取的地点 链接:https://pan.baidu.com/s/1WZlECyIjDyMwdVeyY2Gfqg  提取码:1111  训练的技能点 Spark GraphX API Spar ...

  2. Spark GraphX 中的PageRank算法、pregel函数、航班飞行网图分析

    PageRank算法 PageRank算法原理剖析及Spark实现 - 简书 (jianshu.com) import org.apache.spark.SparkContext import org ...

  3. Spark GraphX-航班飞行网图分析

    文章目录 1.如下图所示的航班表,解决以下问题: 2.思路如下: 3.代码如下: 4.代码如下: 1.如下图所示的航班表,解决以下问题: 统计航班飞行网图中机场的数量 统计航班飞行网图中航线的数量 计 ...

  4. sparkGraphx-航班飞行网图分析

    文章目录 数据格式 构建航班飞行网图 数据格式 文件格式为CSV,字段之间分隔符为"," 依次为:#日.周#.航空公司.飞机注册号.航班号.起飞机场编号.起飞机场.到达机场编号.到 ...

  5. 【Spark GraphX】社交网图分析

    目录 一.数据 1.数据关系图 2. 数据说明 3.顶点表 4.边表 二.需求 三.需求实现 1.构造fans网图 2.找出年龄大于30岁的顶点 3.找出边属性大于5的边 4.将每个顶点的年龄+20 ...

  6. Spark项目实战—电商用户行为分析

    文章目录 一.[SparkCore篇]项目实战-电商用户行为分析 前言:数据准备 1.数据规则如下: 2.详细字段说明: 3.样例类 (一)需求1:TOP10热门品类 1.需求说明 2.代码实现方案1 ...

  7. Spark项目之电商用户行为分析大数据平台之(三)大数据集群的搭建

    Zookeeper集群搭建 http://www.cnblogs.com/qingyunzong/p/8619184.html Hadoop集群搭建 http://www.cnblogs.com/qi ...

  8. 一文了解 NebulaGraph 上的 Spark 项目

    最近我试着搭建了方便大家一键试玩的 Nebula Graph 中的Spark 相关的项目,今天就把它们整理成文分享给大家.而且,我趟出来了 PySpark 下的 Nebula Spark Connec ...

  9. 手把手教你做出数据可视化项目(四)动态模拟航班飞行路线

    数据可视化前言:https://blog.csdn.net/diviner_s/article/details/115933789 项目最终效果图: 此篇博客为自己学习pink老师的课后完成的项目的总 ...

最新文章

  1. 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
  2. 防止在iOS设备中的Safari将数字识别为电话号码
  3. sencha touch list(列表)、 store(数据源)、model(模型)详解
  4. 这个比肩ImageNet的数据集遭MIT紧急下架,原因令人愤怒
  5. UA MATH566 统计理论1 充分统计量例题答案1
  6. 收文处理和发文处理的环节_公文处理,如何提速增效
  7. C# 连蒙带骗不知所以然的搞定USB下位机读写
  8. 机器学习的gridSearchCV调参
  9. 到底什么方法 训练1000个样本,就能完成400万条评论分类!
  10. 【BZOJ3505】[Cqoi2014]数三角形 组合数
  11. 阿里巴巴国际站 | 如何做数据分析?
  12. PumpkinRaising靶机渗透
  13. has leaked IntentReceiver ...that was originally registerd here.Are you missing a call to unregister
  14. 数字功放和模拟功放有哪些区别
  15. UEFI模式创建Grub2引导ubuntu16.04和windows10,并安装Linux Nvidia驱动
  16. 德佑地产房产经纪人区域总监访谈:精耕,业精于勤
  17. IIC协议下的OLED屏幕的三种寻址方式
  18. i7 9750h和r7 5800h差距大不大
  19. Mac--键盘输入的技巧
  20. 百度地图多点路线规划_通勤出行该选谁?高德、百度地图对比,看看谁是上班最优选...

热门文章

  1. nginx -rtmp多码率,动态码率二级m3u8适应
  2. 打赢防“疫”战,云服务商都做了什么……
  3. 服务器虚拟机的c盘怎么加,xp虚拟机c盘怎么扩容
  4. CF Card Reader Test市面CF读卡器不完全测评
  5. linux上创建loopback接口,在python中的特定接口的linux loopback接口
  6. 关于男女交往的换位思考
  7. 父母不会用智能机?这几个功能可要教会他们
  8. 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc
  9. 【SQL注入技巧拓展】————13、我的WafBypass之道(SQL注入篇)
  10. 【C++】DFS——计算土地上水洼的数量