文章目录

  • 一.任务描述
  • 二.具体分析
    • 问题分析1:数据探索
    • 问题分析2:构建航班飞行网图
    • 问题分析3:统计航班飞行网图中机场与航线的数量
    • 问题分析4:计算最长的飞行航线
    • 问题分析5:找出最繁忙的机场
    • 问题分析6:找出最重要的机场
    • 问题分析7:找出最便宜的飞行航线

一.任务描述

需求概述

  • 探索航班飞行网图数据
  • 构建航班飞行网图
  • 使用Spark GraphX完成下列任务
  • 统计航班飞行网图中机场的数量
  • 统计航班飞行网图中航线的数量
  • 计算最长的飞行航线(Point to Point)
  • 找出最繁忙的机场
  • 找出最重要的飞行航线(PageRank)
  • 找出最便宜的飞行航线(SSSP)

二.具体分析

问题分析1:数据探索

  • 下载数据链接: https://pan.baidu.com/s/1fubnDM_sggw_MWS9iI1AoQ 提取码: xnxv
  • 数据格式:文件格式为CSV,字段之间分隔符为“,”
  • 依次为:#日、周#、航空公司、飞机注册号、航班号、起飞机场编号、起飞机场、到达机场编号、到达机场、预计起飞时间(时分)、起飞时间、起飞延迟(分钟)、到达预计时间、到达时间、到达延迟(分钟)、预计飞行时间、飞行距离

问题分析2:构建航班飞行网图

  • 创建属性图Graph[VD,ED]
  • 装载CSV为RDD,每个机场作为顶点。关键字段:起飞机场编号、起飞机场、到达机场编号、到达机场、飞行距离
  • 初始化顶点集airports:RDD[(VertexId,String)],顶点属性为机场名称
  • 初始化边集lines:RDD[Edge],边属性为飞行距离
//导入包
import org.apache.spark.graphx._
//加载数据
val flights = sc.textFile("file:///data/flight.csv").map(_.split(","))
//机场数据
val airports = flights.flatMap(x => Array((x(5).toLong, x(6)), (x(7).toLong,x(8)))).distinct
//航线数据
val lines = flights.map(x => (x(5).toLong, x(7).toLong, x(16).toInt)).distinct.map(x => Edge(x._1, x._2, x._3))
//构建图
val graph = Graph(airports, lines)

问题分析3:统计航班飞行网图中机场与航线的数量

  • 机场数量:求顶点个数:Graph.numVertices
  • 航线数量:求边的个数:Graph.numEdges
//机场个数
graph.vertices.count
graph.numVertices
//航线数
graph.numEdges//补充使用spark_sql
//spark_sql
val df= spark.read.format("csv").option("header","false").option("delimiter",",").load("file:///data/flight.csv").toDF("dom","dow","carrier","tail_num","fl_num","origin_id","origin","des_id","dest","crs_dep_time","dep_time","dep_delay_mins","crs_arr_time","arr_time","arr_delay_mins","crs_elapse_time","dist")
val df2 = df.select("origin_id","origin","des_id","dest")
df2.registerTempTable("flight")
//起飞机场多少个
spark.sql("with t1 as (select origin_id from flight group by origin_id) select sum(1) from t1 ").show//301
df.select("origin_id").distinct.count//301
//目的地机场多少个
spark.sql("with t1 as (select des_id from flight group by des_id) select sum(1) from t1 ").show//301
df.select("des_id").distinct.count//301
//起飞机场和目的地机场多少个
df.select("origin_id").union(df.select("des_id")).distinct.count //301
//航线个数
df.select("origin_id","des_id").distinct.count

问题分析4:计算最长的飞行航线

  • 最大的边属性:对triplets按飞行距离排序(降序)并取第一个
graph.triplets.sortBy(_.attr,false).take(1)
graph.triplets.sortBy(_.attr,false).map(t => "The distance is %d from %s to %s.".format(t.attr, t.srcAttr, t.dstAttr)).take(1)(0)
graph.inDegrees.sortBy(_._2,false).take(1)
graph.outDegrees.filter(x=>x._1==10397).collect
val (x,y)= graph.degrees.sortBy(_._2,false).take(1)(0)//reduce求最大值
lines.reduce((x,y)=>if (x.attr > y.attr) x else y)
//fold求最大值
lines.fold(Edge(0))((x,y)=>if(x.attr> y.attr) x else y)
spark.sql("select * from flight order by cast(dist as int) desc").show(1)

问题分析5:找出最繁忙的机场

  • 哪个机场到达航班最多:计算顶点的入度并排序
//sort
graph.inDegrees.sortBy(_._2,false).take(1)(0)
//reduce
graph.inDegrees.reduce((x,y)=>if(x._2>y._2) x else y)

问题分析6:找出最重要的机场

  • PageRank:收敛误差:0.05
graph.pageRank(0.05).vertices.join(airports).sortBy(_._2._1,false).map(_._2._2).take(1)val g = graph.pageRank(0.0001)
g.vertices.take(10)
val iv = g.vertices.reduce((x,y)=>if(x._2>y._2) x else y)

问题分析7:找出最便宜的飞行航线

  • 定价模型: price = 180.0 + distance * 0.15
  • SSSP问题:从初始指定的源点到达任意点的最短距离

pregel

  • 初始化源点与其它顶点(Double.PositiveInfinity)
  • 初始消息(Double.PositiveInfinity)
  • vprog函数计算最小值
  • sendMsg函数计算进行是否下一个迭代
  • mergeMsg函数合并接受的消息,取最小值
val count = airports.count//总机场数
var fraction = 1.0//系数
var samples = airports.sample(false, fraction/count, count) //抽样
while ( samples.count < 0 ) {fraction = fraction + 1
samples = airports.sample(false, fraction/count, count)
}
val source_id: VertexId = samples.first._1//得到源点 14952
//给初始值,转换定价模型
val init_graph = graph.mapVertices((id, _) => if (id == source_id) 0.0 else Double.PositiveInfinity).mapEdges(e => 180.toDouble + e.attr.toDouble*0.15)
//构建pregel模型
val pregel_graph = init_graph.pregel(Double.PositiveInfinity)(
(id, dist, new_dist) => math.min(dist, new_dist),
triplet => {if ( triplet.srcAttr + triplet.attr < triplet.dstAttr ) {Iterator((triplet.dstId, triplet.srcAttr + triplet.attr))
}
else Iterator.empty
},
(a, b) => math.min(a, b)
)
//航线
val cheap_lines = pregel_graph.edges.map { case(Edge(src_id, dst_id, price))
=> (src_id, dst_id, price) }.takeOrdered(3)(Ordering.by(_._3))
//机场
val cheap_airports = pregel_graph.vertices.takeOrdered(3)(Ordering.by(_._2))

graphx项目实战 — 航班飞行网图分析相关推荐

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

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

  2. Spark项目模拟——航班飞行网图分析

    文章目录 Spark项目模拟--航班飞行网图分析 需求描述 数据准备 需求思路整理 代码实现 总结 机场数量: 航线数量: 最大的边属性: 哪个机场到达航班最多: 找出最重要的飞行航线: 找出最便宜的 ...

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

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

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

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

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

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

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

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

  7. 【网络通信 -- 直播】项目实战记录 -- 弱网模拟工具

    [网络通信 -- 直播]项目实战记录 -- 弱网模拟工具 [1]Windows 系统中弱网模拟工具 Windows 系统中可以使用 Clumsy 工具模拟弱网环境 Lag(延迟),把数据包缓存一段时间 ...

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

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

  9. 美工效果图大小 html,六、DIV CSS实战之布局美工图分析与切图

    DIV CSS实战之布局分析与切图 美工图到DIV CSS制作成HTML中间必不可少的步骤为对美工图的分析和美工图的切图.平时大家说切图也是从这个步骤捡取的一个词语来代表css完整制作的代名词,就像d ...

  10. 项目实战——仿360囧图

    一.项目实战 1.创新从模仿开始,咱们的第一综合实例就从模仿网页-360囧图开始,网址:http://xiaohua.360.cn/jiongtu 2.第一个项目采用固定浮动布局,单位为像素. 3.由 ...

最新文章

  1. 广东安网2016:重拳挥出 打造安宁互联网环境
  2. XOOM MZ606 刷机
  3. 动态删除nod linux_Linux文件操作实用笔记
  4. 从函数式接口到lambda表达式
  5. paip.PHP代码生成器比较
  6. 如何在校外下载期刊全文应对大家工作后的资料搜寻
  7. python分词与去停用词简单实操
  8. 获取当前本地登录的QQ号码
  9. 编译原理-4-上下文无关文法
  10. oracle导出报错00091,exp报错:EXP-00091 Exporting questionable statistics
  11. 基于Python的jieba分词和词云展示
  12. 作为程序员你应该会的软件
  13. 求一个3*3的整形矩阵对角线元素之和
  14. Java 哈密顿距离
  15. [Kafka][错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]
  16. 信创产业现状、分析与预测
  17. iib mq 在linux环境下安装
  18. java if中的continue_java中break和continue源码解析
  19. 写了一篇文章老是提示包含敏感词,修改了好多遍
  20. 影视剪辑,什么是蒙太奇,蒙太奇的含义

热门文章

  1. 2020离散数学系列
  2. 调查了23款加速器,只剩这几款可以白嫖了!
  3. 软件开发文档-详细设计文档
  4. 专访尹毅(法师Seay):少年成名,野路子的奇妙逆袭 - FreeBuf.COM | 关注黑客与极客...
  5. 窃取百度搜索结果曝光,今日头条一直穿着“皇帝的新装”?
  6. 传感器实训心得体会_传感器心得体会范文
  7. 软件 规则引擎_如何设计软件规则引擎
  8. Oracle分析函数
  9. Hbase 深度使用分析
  10. java 32位无符号整数_Java中32位无符号数的取法