168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

1 2 3 4 5
开启左侧

原创译文 | 这有一份技术指南,如何用大数据分析图表

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

假设在社交网络中,网络中的某一位人员在他的网络中有数百个连接,这些连接点可能是不同好友,不用的粉丝或者其他的等等,并且通过这些连接可以进一步连接到可能在不同国家的数百个其他用户。将这些信息存储在传统的关系数据库中是不能扩展的。因此,我们将在这篇文章中介绍
●  在Apache Spark上使用图框架构建存储在HDFS中的大数据图。
●  在大数据之上使用图表分析真实世界航班数据集。

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

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

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

机场数据集
该数据集包含有关机场的信息,如下所示
2.webp.jpg
路线数据集
此数据集包含有关机场之间的路线的信息,如下所示:
3.webp.jpg
航空公司数据集
此数据集包含有关在此数据集中表示的航空公司的信息。
4.webp.jpg
让我们开始使用apache spark和图框进行分析。

航班数据分析
在我们运行任何分析之前,我们将建立我们的常规代码开始。我们将创建spark会话来开始加载我们的数据集。
SparkConf conf = ...
SparkSession会话= ...
我们现在加载机场数据集。即使这个文件存储在本地,但它可以驻留它HDFS或在亚马逊S3和Apache的数据集中,让我们来分析一下
数据集rawDataAirport = session.read()。csv(“data / flight / airports.dat”);
现在让我们看看这些数据的前几行。Spark有一个方便的show()方法,如下所示:
rawData.show();
5.webp.jpg
我们不会为这些原始列提供一些模式。为此,我们将映射并将这些数据加载到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()显示();
属性
6.webp.jpg
现在让我们来看看印度的机场,这是很容易的图形框架
gf.vertices()。filter(“country = India'”。show();
这将显示印度机场的前几行
7.webp.jpg
检查右侧的状态,并显示不同城市的机场为“艾哈迈达巴德”,“孟买”,“博帕尔”等。

现在我们来看看印度的机场总数。这是一个简单的查询,如图所示
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();
数据为
8.webp.jpg
这是相当多的权利。从这个机场每天有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“)显示();
这将打印给德里和孟买之间的直航航空公司:
9.webp.jpg
如图所示,可以使用图中的概念来获取相同的数据
gf.triplets()。filter(“src.airportIataCode ='DEL'和
                                           dst.airportIataCode = 'BOM'“)表示();
数据为
10.webp.jpg
现在让我们找到“德里”和“普杰”之间的三联或直飞航线,
gf.triplets()。filter(“src.airportIataCode ='DEL'和
                                           dst.airportIataCode = 'BHJ'“)表示();
这将打印结果为
11.webp.jpg
这是一个空的结果。因此不存在直航。现在我们需要找到是否有这种“单站飞行”到这个命运。我们可以简单地第一次搜索来做到这一点。
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);
这将在屏幕上显示结果
12.webp.jpg
因此,为了从德里去布杰,你可以乘坐飞机前往孟买,从孟买直接飞往布吉。您可以通过更改查询并显示航空公司来美化结果。

最后让我们看看一个重要而复杂的部分。如果我现在告诉你,根据其重要性在印度的机场。一种方法是检查进出的最大航班。但另一种方法是使用页面排序算法。因此,不仅是航班数量,我们还将看到重要的机场如何直接连接到另一个重要的机场,并在此基础上每个机场获得分数和排名。PageRank捆绑在图框内,所以代码只是一个衬里,如下所示:
session.sql(“select distinct.state,v1.state,to.state from 。sfo_to_buf“)显示(100);
这个操作只要遍历所有的节点和边缘就可以运行。你能想象谷歌将如何做到这一点,他们得到的数据量?

正如您所看到的,每个机场都会获得一个如下图所示的右侧栏中显示的网页排名值
13.webp.jpg
这个pagerank值越多,机场就越重要。为了得到一个更有意义和排序的结果(根据他们的页面排名),可以在上面的页面排名数据集顶部触发另一个查询,如下所示:
pg.createOrReplaceTempView( “页面的PR值”);

session.sql(“select * from pageranks order by pagerank desc”)。show(20);
结果为
14.webp.jpg
这个排名结果和实际还是非常相符合的。印度最顶级的机场是德里,接着是孟买,然后是加尔各答和班加罗尔。

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


楼主热帖
168大数据(www.bi168.cn)是国内首家系统性关注大数据与数据科学的社区媒体与产业服务平台!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2017-12-16 05:28 , Processed in 0.084876 second(s), 20 queries , Xcache On.

Powered by BI168社区

© 2012-2014 海鸥科技

快速回复 返回顶部 返回列表