工程的博客

准时飞行性能与GraphFrames Apache火花

分享这篇文章

介绍

图结构是许多类的数据更直观的方法问题。社交网络是否遍历、餐厅推荐或飞行路径,更容易理解这些数据问题的上下文中图结构:顶点,边和属性。例如,飞行数据的分析是一个经典的图问题机场表示顶点和航班是由边缘。,有很多属性与这些航班包括但不限于起飞延误,飞机类型和载体。

在这篇文章中,我们将使用GraphFrames(最近宣布的引入GraphFrames)在砖笔记本可以快速、方便地分析飞行性能数据的组织图结构。因为我们使用图结构,我们可以很容易地问一些问题,没有直观的表格结构如发现结构图案,机场排名的PageRank,城市之间的最短路径。GraphFrames杠杆率的分布和表达能力DataFrame API来简化你的查询和利用Apache火花的性能优化的SQL引擎。此外,GraphFrames图分析可以在Python中,Scala和Java。

安装GraphFrames火花包

使用GraphFrames,你首先需要安装GraphFrames火花包。安装包砖是几个简单的步骤(加入β候补名单尝试为自己)。

注意,内部参考GraphFrames spark-shell pyspark,或spark-submit:

SPARK_HOME美元/bin/spark-shell——包graphframes: graphframes:0.10-spark1。6

准备飞行数据集

构成我们的两套数据图机场数据集(顶点),可以发现OpenFlights机场,航空公司和路由数据departuredelays数据集(边缘),可以发现航空公司准时性能和航班延误的原因:On_Time数据

安装好后GraphFrames火花包,您可以导入并创建顶点,边,GraphFrame (PySpark)如下表示。

#进口graphframes(从Spark-Packages)
从graphframes进口*

#创建顶点(机场)和边(航班)
tripVertices =机场。withColumnRenamed(“国际航空运输协会”、“id”) .distinct ()
tripEdges = departureDelays。选择(“tripid”、“延迟”,“src”、“夏时制”,“city_dst”、“state_dst”)

#这GraphFrame构建在顶点和边基于我们的旅行(航班)
tripGraph = GraphFrame (tripVertices tripEdges)

例如,tripEdges包含了飞行数据确定起源国际航空运输协会机场代码(src)和目的地国际航空运输协会机场代码(dst),城市(city_dst),状态(state_dst)以及起飞延误(延迟)。

tripEdges

简单查询tripGraph GraphFrame

现在您已经创建了您tripGraph GraphFrame,您可以运行一些简单的查询快速遍历和理解你的GraphFrame。例如,要了解机场和旅行的数量在你GraphFrame,运行下面PySpark代码。

打印”机场:% d % tripGraph.vertices.count ()
打印”旅行:% d % tripGraph.edges.count ()

它返回的输出:

机场:279旅行:1361141

因为GraphFrames DataFrame-based火花图,您可以编写高度表达查询利用DataFrame API。例如,下面的查询允许我们过滤(边缘)航班延误航班(延迟> 0)来自旧金山机场,我们计算和排序的平均延迟,即。什么航班离开旧金山最有可能产生重大延误?

tripGraph.edges \
.filter (“src =“旧金山”和延迟> 0 ")\
.groupBy (“src”、“dst”) \
.avg \(“延迟”)
.sort (desc (avg(延迟)))

评审输出,您将快速识别有重要的平均延误将罗杰斯世界机场(俄),杰克逊霍尔(江淮)和科罗拉多斯普林斯(COS) SFO在这个数据集。

SFO-significant-delays

砖的笔记本电脑,我们还可以快速可视化地理位置:什么目的地国家往往有明显的延迟离开海吗?

SEA-delays-by-state-map

使用主题发现了解航班延误

更容易地理解城市机场和航班的复杂关系,我们可以使用主题找到机场的模式(即顶点)连接的航班(即边缘)。的结果是一个DataFrame列名有图案的钥匙。

例如,要问的问题我们延迟可能归咎于SFO什么呢?,您可以生成下面的简化的主题。

主题= tripGraphPrime.find (“(a) - (ab) - > (b);(b) - (bc) - > (c)) \
.filter (“(b。id =“旧金山”)和(ab.delay > 500或bc.delay > 500)和bc。tripid > ab.tripid和bc。tripid > ab.tripid + 10000”)
显示器(主题)

与SFO作为连接城市(b),我们正在寻找所有航班(ab)从任何来源城市(a)之前,将连接到旧金山(b) (bc)飞往任何目的地城市(c)。我们也过滤它,推迟航班((ab)或(bc))大于500分钟和第二飞行(bc)发生在大约一天的第一次飞行(ab)。

下面是一个简略子集从这个查询列是各自的主题的钥匙。

一个 ab b 公元前 c
休斯顿(IAH) IAH - > 4 (SFO)
[1011126]
旧金山(SFO) 旧金山- >肯尼迪(536)
[1021507]
纽约(肯尼迪)
图森市(摘要) 摘要- > 5 (SFO)
[1011126]
旧金山(SFO) 旧金山- >肯尼迪(536)
[1021507]
纽约(肯尼迪)

与这个主题发现查询,我们很快决定,乘客在这个数据集离开休斯顿和图森市旧金山准时或者提前一点[1011126]。但是对于那些乘客,通过这个转机飞往纽约在旧金山[1021507],他们推迟了536分钟。

利用PageRank寻找最重要的机场

因为GraphFrames是建立在GraphX,有很多内置的算法,我们可以利用。网页排名是由Google搜索引擎推广的和由拉里•佩奇。引用维基百科:

PageRank是通过计算一个页面的链接的数量和质量来确定一个粗略的估计的网站是多么的重要。潜在的假设是,更重要的是网站可能会获得更多从其他网站的链接。

在上面的例子中是指网页,这一概念有什么可怕的是它很容易适用于任何图结构是否创建的网页,自行车,或者机场和接口调用方法一样简单。您还会注意到,GraphFrames将返回网页排名的结果作为一个新列添加到顶点DataFrame跑后为一种简单的方式来继续我们的分析算法。

有大量的航班并通过各种连接机场包含在这个数据集,我们可以使用网页排名算法有火花迭代遍历图计算的粗略估计每个机场是多么的重要。

使用网页排名#确定机场排名的重要性
排名= tripGraph.pageRank (resetProbability = 0.15,麦克斯特= 5)

显示器(ranks.vertices.orderBy (ranks.vertices.pagerank.desc ()) .limit (20))

正如下面的图表,使用网页排名算法,亚特兰大机场被认为是最重要的一个基于连接的质量(如航班)之间的不同的顶点(机场);对应于这一事实亚特兰大是世界上最繁忙的机场客运量

airport-ranking-pagerank-id

确定航班中转

有如此多的不同城市之间的航班,您可以使用GraphFrames.bfs(广度优先搜索)方法找到两个城市之间的路径。下面的查询试图找到旧金山之间的路径(SFO)和水牛(BUF) 1(我的最大路径长度。e直接飞行)。结果集是空的(即和BUF SFO)之间没有直飞航班。

filteredPaths = tripGraph.bfs (
fromExpr = " id =“旧金山”,
toExpr = " id =“缓冲区”,
maxPathLength = 1)
显示器(filteredPaths)

让我们有一个扩展查询maxPathLength = 2之间有一个转机,SFO和缓冲区。

filteredPaths = tripGraph.bfs (
fromExpr = " id =“旧金山”,
toExpr = " id =“缓冲区”,
maxPathLength = 2)
显示器(filteredPaths)

一个简略的子集路径从旧金山到缓冲区中可以看到下面的表。

v1
旧金山 MSP(明尼阿波利斯) 缓冲区
旧金山 英文文宣写作研习营(纽瓦克) 缓冲区
旧金山 肯尼迪(纽约) 缓冲区
旧金山 奥德(芝加哥) 缓冲区
旧金山 ATL(亚特兰大) 缓冲区
旧金山 拉斯维加斯(拉斯维加斯) 缓冲区
旧金山 BOS(波士顿) 缓冲区

使用D3可视化飞行

得到一个强大的可视化的飞行路径和连接在这个数据集,我们可以利用机场D3可视化在我们的砖笔记本。通过连接我们GraphFrames DataFrames, D3可视化,我们可以想象所有的航班中转的范围如下指出准时或提前离开的航班在这个数据集。蓝色的圆圈表示的顶点即机场圆圈代表边的数量的大小即航班的机场。黑色线条的边缘本身即航班和各自连接到另一个顶点即机场。注意画面以外的任何边缘,他们是代表顶点即机场在美国夏威夷和阿拉斯加。

https://www.youtube.com/watch?v=riJGOmKF3Bs

免费试着砖
看到所有工程的博客的帖子