这有一份技术指南,如何用大数据分析图表

导读:上一期学习了软体机器人的相关介绍,今天我们来了解一下使用大数据进行图表分析的相关技能(文末更多往期译文推荐)

图表是最流行的计算机科学概念之一。他们已被广泛用于现实世界的应用程序,无论是在你手机上的GPS或汽车上的GPS设备,很多图表都可以直观显示出你抵达目的地的最短路径至社交网络,你还可以添加到你的好友列表进行分享你的路径,图表无处不在。随着数据量的增加,图表的概念(广度优先搜索,Djikstra等)都保持不变,但图表的实际构建方式发生了变化。

假设在社交网络中,网络中的某一位人员在他的网络中有数百个连接,这些连接点可能是不同好友,不用的粉丝或者其他的等等,并且通过这些连接可以进一步连接到可能在不同国家的数百个其他用户。将这些信息存储在传统的关系数据库中是不能扩展的。因此,我们将在这篇文章中介绍

● 在Apache Spark上使用图框架构建存储在HDFS中的大数据图。

● 在大数据之上使用图表分析真实世界航班数据集。

GraphFrames

要使用Spark创建图形和分析大数据图,我们使用了一个开源库图框。目前,使用“Java”来构建图形和分析图形,这是Apache spark上唯一可用的选项。

Spark有一个优秀的内建库'GraphX',是可以直接与Scala结合,不过我还没有尝试使用它与Java的结合使用。Graphframes也是大规模可扩展的,因为它是建立在数据集之上的,并且更容易使用。

图表分析机场和航班数据集

这是一个非常受欢迎的真实数据集,我们正在使用这个数据集进行分析。它来自于开放航班机场数据库(https://openflights.org/data.html)。这里有3个数据集,他们是:

机场数据集

该数据集包含有关机场的信息,如下所示

路线数据集 此数据集包含有关机场之间的路线的信息,如下所示:

航空公司数据集 此数据集包含有关在此数据集中表示的航空公司的信息。

让我们开始使用apache spark和图框进行分析。

航班数据分析 在我们运行任何分析之前,我们将建立我们的常规代码开始。我们将创建spark会话来开始加载我们的数据集。

SparkConf conf = ...

SparkSession会话= ...

我们现在加载机场数据集。即使这个文件存储在本地,但它可以驻留它HDFS或在亚马逊S3和Apache的数据集中,让我们来分析一下

数据集rawDataAirport = session.read()。csv(“data / flight / airports.dat”);

现在让我们看看这些数据的前几行。Spark有一个方便的show()方法,如下所示:

rawData.show();

我们不会为这些原始列提供一些模式。为此,我们将映射并将这些数据加载到java pojo中,如图所示。我们的pojo对象是机场

airportsRdd =rawDataAirport.javaRDD()。map(row - > { 机场ap =新机场(); ap.setAirportId(row.getString(0)); ap.setState(row.getString(2)); . .. 返回ap; });

我们可以将这个rdd转换成数据集,因为数据集更容易查询和使用。

数据集机场= session.createDataFrame(airportsRdd.rdd(),Airport.class);airports.createOrReplaceTempView( “机场”);

与此类似,我们也可以如图所示加载路线的数据。

数据集rawDataRoute = session.read()。csv(“data / flight / routes.dat”);

再一次,我们可以将每行加载到一个java pojo Route中并存储在一个rdd对象中。

JavaRDD routesRdd = rawDataRoute.javaRDD()。map(row - > { 路由r =新的路由(); r.setSrc(字符串) r.setDst(字符串)... 返回r;

});

我们将把它转换回数据集,就像我们之前为机场所做的那样。

数据集路由= session.createDataFrame(routesRdd.rdd(),Route.class);

现在我们有两个数据集 - 机场和路线。你可以记着,图形是用计算机科学中的节点和边缘构建的。从图的角度来看,我们的节点是机场,它们通过它们提供的路线与边缘连接。

因此,为了使用图框来构建图表,我们提供机场和路线的节点和边缘:

GraphFrame gf =新的GraphFrame(机场,路线);

Graphframe要求你的顶点有一个“ID”属性,在你的边缘有一个相应的“src”和“dest”属性(检查我们的pojo是否有这些列或属性)。

现在我们的图形对象已经准备就绪,它使用Spark,Graphframe堆栈,位于大数据之上。

。gf.vertices()显示();

属性

现在让我们来看看印度的机场,这是很容易的图形框架

gf.vertices()。filter(“country = India'”。show();

这将显示印度机场的前几行

检查右侧的状态,并显示不同城市的机场为“艾哈迈达巴德”,“孟买”,“博帕尔”等。

现在我们来看看印度的机场总数。这是一个简单的查询,如图所示

System.out.println(“印度机场---->”+ gf.vertices()。filter(“country = “印度“)数())。

这将显示印度的机场数量

印度的机场 - > 125

注意:这是根据这个数据集。您可能需要检查网络上的信息的真实性。

现在让我们来看看在德里的“英迪拉·甘地国际机场”进出的航班为此可以找到边的度数(流入和流出顶点的边的数量)并在其上激发相应的查询

数据集度数DS = gf.degrees(); degreesDS.createOrReplaceTempView( “等级”);

session.sql(“从AIRPORTS a选择a.airportName,a.State,a.Country,d.degree, DEGREES d where a.airportIataCode = d.id and d.id ='DEL'“).show();

数据为

这是相当多的权利。从这个机场每天有527个航班进出。

我们也可以把这个信息分解成流入这个机场的航班。要做到这一点,而不是'degrees()'方法使用'inDegrees()'和'outDegrees()'方法和其余代码是类似的。我把这段代码留给你自己去做,但是当你运行这段代码的时候,你应该看到下面的输出:

出发的航班:英迪拉甘地国际机场,德里,印度,264机票参与:英迪拉甘地国际机场,德里,印度,263

同样,我们也可以找到外出的航班或者到其他机场的航班。此外,由于这是简单的SQL只有你可以发起一个查询,以查找在该国进出的航班数量

现在让我们来看看“德里”和“班加罗尔”之间的直飞航班。这又是一个简单的查询:

session.sql(“从ROUTES r选择a.airlineName,r.src,r.dst,AIRLINES a” +“其中r.src ='DEL'和r.dst ='BOM'和 r.airlineCode = a.airlineId“)显示();

这将打印给德里和孟买之间的直航航空公司:

如图所示,可以使用图中的概念来获取相同的数据

gf.triplets()。filter(“src.airportIataCode ='DEL'和 dst.airportIataCode = 'BOM'“)表示();

数据为

现在让我们找到“德里”和“普杰”之间的三联或直飞航线,

gf.triplets()。filter(“src.airportIataCode ='DEL'和 dst.airportIataCode = 'BHJ'“)表示();

这将打印结果为

这是一个空的结果。因此不存在直航。现在我们需要找到是否有这种“单站飞行”到这个命运。我们可以简单地第一次搜索来做到这一点。

Dataset sfoToBufDS = gf.bfs()。fromExpr(“id ='DEL'”)。toExpr(“id ='BHJ'”)maxPathLength(2).run();

正如你在上面看到的,广度优先搜索的结果也是以数据集的形式出现的,我们将它存储在一个变量中。接下来,我们将这个数据集注册为一个临时视图,称为“sfo_to_buf”

sfoToBufDS.createOrReplaceTempView( “sfo_to_buf”)

最后,我们将在这个临时视图上查询,以确定顶点的起始状态和连接状态,以及最后飞行结束的状态。我们还将通过调用show方法将输出到控制台。

session.sql(“select distinct.state,v1.state,to.state from 。sfo_to_buf“)显示(100);

这将在屏幕上显示结果

因此,为了从德里去布杰,你可以乘坐飞机前往孟买,从孟买直接飞往布吉。您可以通过更改查询并显示航空公司来美化结果。

最后让我们看看一个重要而复杂的部分。如果我现在告诉你,根据其重要性在印度的机场。一种方法是检查进出的最大航班。但另一种方法是使用页面排序算法。因此,不仅是航班数量,我们还将看到重要的机场如何直接连接到另一个重要的机场,并在此基础上每个机场获得分数和排名。PageRank捆绑在图框内,所以代码只是一个衬里,如下所示:

session.sql(“select distinct.state,v1.state,to.state from 。sfo_to_buf“)显示(100);

这个操作只要遍历所有的节点和边缘就可以运行。你能想象谷歌将如何做到这一点,他们得到的数据量?

正如您所看到的,每个机场都会获得一个如下图所示的右侧栏中显示的网页排名值

这个pagerank值越多,机场就越重要。为了得到一个更有意义和排序的结果(根据他们的页面排名),可以在上面的页面排名数据集顶部触发另一个查询,如下所示:

pg.createOrReplaceTempView( “页面的PR值”);

session.sql(“select * from pageranks order by pagerank desc”)。show(20);

结果为

这个排名结果和实际还是非常相符合的。印度最顶级的机场是德里,接着是孟买,然后是加尔各答和班加罗尔。

这篇文章帮助我们探索了使用Apache Spark和Graphframes对大数据进行复杂图表分析,我们完全可以掌握并且这不是一件多么难的事情。大数据不仅可以帮助我们深入探讨路径分析,除此之外,使用大数据进行图表分析也可以帮助我们分析大量的社交网络发生的各类热点事件,这也是我们需要继续学习的地方。

文章编辑:秦革

原文发布于微信公众号 - 灯塔大数据(DTbigdata)

原文发表时间:2017-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏vue学习

读《学习之道》— 搭建组块对抗发懵

611
来自专栏C语言及其他语言

重新敲一遍代码,胜过拷贝粘贴

来源:腊八粥 网址:http://www.labazhou.net/2015/10/dont-copy-paste-retype/ ---- 原文地址(ori...

3185
来自专栏牛客网

腾讯测开一面(电话面)面经

一个人的一生中总会遇到这样的时候,一个人的战争。这种时候你的内心已经兵荒马乱天翻地覆了,可是在别人看来你只是比平时沉默了一点,没人会觉得奇怪。这种战争,注定单枪...

2781
来自专栏牛客网

美团酒旅四面面经下面贴一下面经

结束了自己的秋招,收到美团的池子短信,一路过来真的感概良多,我属于弱鸡....到目前为止就拿了2个offer,之前面试各种笔试挂,面试挂,投了40家左右吧,本来...

3487
来自专栏Crossin的编程教室

【每周一坑】3道练习题

如题图所示,今天把论坛(crossin.me)的服务器迁移到一个很萌的云服务上,速度还可以。欢迎大家常来。 这里再次感谢 aresli 同学提供的服务器,让论坛...

35017
来自专栏钱曙光的专栏

一周极客热文:200 行 C 代码编写你的第一个垃圾收集器

一名程序员在许多事物缠身,心里烦乱的情况下如何排解呢?Google Dart团队的一名工程师通过编写一个“垃圾收集器”来调整自己,而且起到了一个非常好的效果,但...

2119
来自专栏WeTest质量开放平台团队的专栏

60帧的丝般顺畅 - QQ飞车手游优化点滴

加入项目组的这段时间主要是承担性能优化这块的工作,同时也会去实现一些场景材质、特效材质以及工具。今天就性能优化这块分享一下个人的经验。

1172
来自专栏CSDN技术头条

Hacker曾经知晓的那些事

笔者想到现在年轻的Hacker们对ASCII表和那些奇怪的控制字符越来越陌生,不禁感慨万千。 这些知识原本是年轻Hacker们初出茅庐的第一课。然而世事变迁无常...

25410
来自专栏听雨堂

关于IP,这里有你想知道的一切!

3404
来自专栏腾讯大数据的专栏

四两拨千斤:借助Spark GraphX将QQ千亿关系链计算提速20倍

腾讯QQ有着国内最大的关系链,而共同好友数,属于社交网络分析的基本指标之一,是其它复杂指标的基础。借助Spark GraphX,我们用寥寥100行核心代码,在高...

4158

扫码关注云+社区

领取腾讯云代金券