楼主: 时光永痕
403 0

[数据挖掘新闻] 在10分钟内实用Apache Spark。第6部分-GraphX [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

59%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在10分钟内实用Apache Spark。第6部分-GraphX
我们介绍了使用Spark进行流传输的基础知识。今天,我们要讨论图形,并探索 用于图形计算和分析的Apache Spark GraphX 工具。有必要说GraphX仅适用于Scala。
图是由顶点和顶点之间的边组成的结构。图论在各种领域都得到了应用,例如计算机科学,语言学,物理学,化学,社会科学,生物学,数学等。与图分析相关的问题相当复杂,但是出于这些目的,有许多现代便捷的工具和库。
在本文中,我们将考虑以下图形示例:城市是顶点,城市之间的距离是边。您可以 在下图中看到此结构的Google Maps 插图。
为了开始使用上面提到的图形,让我们启动Spark shell。为此,请转到Spark主目录并在控制台中输入:
./bin/spark-shell
现在,我们必须进行一些导入:
导入org.apache.spark.graphx.Edge导入org.apache.spark.graphx.Graphimport org.apache.spark.graphx.lib._
创建属性图
要创建属性图,我们首先应该创建一个顶点数组和一个边数组。对于顶点数组,请输入spark shell:
val verArray = Array((1L,(“ Philadelphia”,1580863)),(2L,(“ Baltimore”,620961)),
(3L,(“ Harrisburg”,49528)),
(4L,(“ Wilmington”,70851)),
(5L,(“ New York”,8175133)),
(6L,(“ Scranton”,76089)))
顶点的属性分别表示城市名称和人口。
作为输出,您将看到以下内容:
verArray:Array [(Long,(String,Int))] = Array((1,(费城,1580863)),(2,(巴尔的摩,620961)),(3,(哈里斯堡,49528)),(4, (威尔明顿,70851)),(5,(纽约,8175133)),(6,(斯克兰顿,76089)))
要创建edges数组,请输入spark shell:
val edgeArray = Array(Edge(2L,3L,113),Edge(2L,4L,106),
边线(3L,4L,128),
边线(3L,5L,248),
边线(3L,6L,162),
边线(4L,1L,39),
边线(1L,6L,168),
边线(1L,5L ,130),
Edge(5L,6L,159))
第一个和第二个自变量表示源顶点和目标顶点标识符,第三个自变量表示edge属性,在我们的例子中,它是相应城市之间的距离(以公里为单位)。
上述输入将为我们提供以下输出:
edgeArray:Array [org.apache.spark.graphx.Edge [Int]] = Array(Edge(2
接下来,我们将使用以下sc.parallelize()命令从顶点和边数组创建RDD :
val verRDD = sc.parallelize(verArray)val edgeRDD = sc.parallelize(edgeArray)
我们准备构建属性图。基本属性图构造函数采用顶点的RDD和边的RDD并构建图。
val graph = Graph(verRDD,edgeRDD)
现在我们有了属性图,现在该考虑可以使用图执行的基本操作了,例如通过顶点过滤,通过边缘过滤,使用三重态和聚合的操作。
顶点过滤
为了说明按顶点进行的过滤,让我们找到人口超过50000的城市。要实现这一点,我们将使用filter运算符:
graph.vertices.filter {案例(id,(城市,人口))=>人口> 50000} .collect.foreach {
    case(id,(city,population))=>
    println(s“ $ city的人口是$人口”)
}
这是我们得到的结果:
斯克兰顿的人口为76089,威尔明顿的人口为70851,费城的人口为1580863
纽约
的人口是8175133巴尔的摩的人口是620961
三胞胎
GraphX的核心功能之一通过三元组RDD公开。每个边缘有一个三元组,其中包含有关顶点和边缘信息的信息。让我们来看看graph.triplets.collect。
作为使用三胞胎的示例,我们将找到相连城市之间的距离:
for(triplet <-graph.triplets.collect){println(s“”“ $ {triplet.srcAttr._1}与$ {triplet.dstAttr._1}之间的距离为$ {triplet.attr}公里”“”)
}
结果,您应该看到:
巴尔的摩与哈里斯堡的距离为113公里巴尔的摩与威尔明顿的距离为106公里哈里斯堡与威尔明顿的距离为128公里
哈里斯堡和纽约之间的距离为248公里
哈里斯堡和斯克兰顿之间的距离是162公里的
威尔明顿和费城之间的距离是39公里
费城和纽约之间的距离为130公里
费城之间的距离和斯克兰顿是168公里
之间的距离纽约和斯克兰顿相距159公里
边缘过滤
现在,让我们考虑另一种过滤,即边缘过滤。为此,我们要查找两座城市之间的距离小于150公里的城市。如果我们输入spark shell,
graph.edges.filter {case Edge(city1,city2,distance)=> distance <150} .collect.foreach {
  case Edge(city1,city2,distance)=>
  println(s“ $ city1和$ city2之间的距离为$ distance”)
}
我们将看到下一个结果:
2与3之间的距离为113、2与4之间的距离为106、3与4之间的距离为128
4和1之间的距离是39
1和5之间的距离为130
聚合
在这里可以考虑的另一个有趣的任务是聚合。我们将找到附近城市的总人口。但是在开始之前,我们应该稍微改变一下图表。原因是GraphX仅处理有向图。但是要考虑到两个方向上的边缘,我们应该将反向添加到图形中。让我们将反向边缘与原始边缘结合起来。
val undirectedEdgeRDD = graph.reverse.edges.union(graph.edges)val graph = Graph(verRDD,undirectedEdgeRDD)
现在我们有了一个无向图,其中考虑了所有的边缘和方向,因此我们可以使用aggregateMessages运算符执行聚合:
val neighbors = graph.aggregateMessages [Int](ectx => ectx.sendToSrc(ectx.dstAttr._2),_ + _)
要查看结果,请键入:
neighbors.foreach(println(_))
您应该获得以下输出,
(4
(2
(6
(3
其中第一个参数是顶点ID,第二个参数是邻近城市的总人口。
结论
GraphX是非常有用的Spark组件,在计算机科学,生物学和社会科学等不同领域中都有许多应用程序。在本文中,我们考虑了一个简单的图形示例,其中顶点是城市,边是城市之间的距离。一些基本操作(例如,通过顶点过滤,通过边缘过滤,使用三重操作和聚集操作)已应用于此图。总而言之,我们证明了Apache Spark GraphX组件非常方便并且适用于图形计算。
1
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Apache Spark apache Spark GRAPH Park

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-2 08:43