0
点赞
收藏
分享

微信扫一扫

Spark GraphX 图形化实验手册(1)

慎壹 2022-04-22 阅读 115

Spark GraphX 图形化实验手册

一、基本入门

1、准备收据

SNAP: Network datasets: High-energy physics theory citation network

[root@node1 etc]# spark-shell --master local[2]

2、上传数据到本地文件

 

3、开始spark程序

 scala> import org.apache.spark.graphx._  //导入相关依赖
 import org.apache.spark.graphx._  
 ​
 scala> val graph = GraphLoader.edgeListFile(sc,"/datas/test.txt") //读取数据从hdfs
 graph: org.apache.spark.graphx.Graph[Int,Int] = org.apache.spark.graphx.impl.GraphImpl@7b6b3ed6

GraphLoader是GraphX类库里的对象,通过上一步依赖导入。GraphLoader有 一个函数edgeListFile,用于加载边列表格式的文本文件,生成图。edgeList- File 函数有两个必填参数,第一个是前面 Spark Shell 创建的 SparkContext参数 sc,第二个参数是边列表文件的路径。我们把 cit-HepTh.txt 文件复制到了Spark Shell 的当前目录,所以文件路径就是当前目录的文件名。 Spark Shell 的输出表示已经成功创建了一个类型为 org.apache.spark. graphx.Graph【Int,Int】的对象,变量名为Ggraph。

graph.inDegrees.reduce((a,b)=>if(a.2 >b.2)a else b) //对象调用的inDegrees 函数可得到一个顶点ID

 scala> graph.inDegrees.reduce((a,b)=>if(a._2>b._2) a else b)
 res1: (org.apache.spark.graphx.VertexId, Int) = (9711200,2414) 

如我们所见,确切地说,ID为9711200的论文(1997年11月的第200个论文) 被其他论文引用了2414次之多。

我们可以查看一下第一个数据,和前三个顶点ID数据

 

说明:inDegrees很厉害,他完成了分组+1,reduce,完成了先聚合统计,然后比较不同分组中的第二个数值,就可以看出来,那个是第二个值最大,然后就是访问调用最多的那个!

1是怎么来的?GraphX是一个天然的属性图处理器, 这意味着GraphX允许顶点和边都有自己的属性集。这些数值1是后面用到的函数 GraphLoader.edgeListFile()给顶点属性赋予的一个默认值,所以这些顶点就 有了默认值,虽然这个默认值不表示任何意义。GraphX可以处理有属性值的顶点, 而边列表文件中并没有属性值。属性值是 PageRank算法为顶点计算出的。

 

也就是顶点,1,形成了RDD{}数组!

我们同样也可以修改顶点后面的参数,随机变成double类型

 scala> val v = graph.pageRank(0.001).vertices
 //v: org.apache.spark.graphx.VertexRDD[Double] = VertexRDDImpl[1145] at RDD at VertexRDD.scala:57
 scala> v.take(10)
 ​

 

 传递给 pageRank()的参数值 0.001是为了平衡速度和最终结果准确度之间的
 一个容忍度数值。这个容忍度值如果设置得过高则运行速度会很快,但是计算结果
 不准确,如果设置得过低,算法的运行时间将会太长,精确度没什么变化。现在我
 们看一下运行完 PageRank 图算法后排前10的顶点∶
 ​
 这些浮点值就是PageRank 值,前10的PageRank 范围是从0.15到1.34。
 现在我们在结果集v上运行reduce()归并函数,找出PageRank 值最高的顶点。
 ​
 scala> v.reduce((a,b) => if (a._2 > b._2) a else b)
 //res3: (org.apache.spark.graphx.VertexId, Double) = (9207016,172.7065661984784)

 通过 PageRank 算法,我们发现ID为9207016的论文是最有影响力的论文。如
 果你已下载了论文摘要的归档文件,找到论文ID为9207016的论文摘要,这篇论
 文名为《非对称弦理论》,由 Jnan Maharana 和John H.Schwarz在1992年发表。
 我们将会进一步讲解 PageRank 算法的细节。

 

二、实验,两个表格的融合,和路径的图例

可以用给定的边RDD 和顶点RDD构建一个图。一旦构建好图,就可以用函数 edges()和 vertices()来访问边和顶点的集合。

 

 

 val myVertices = sc.makeRDD(Array((1L,"Ann"),(2L,"Bil1"),(3L,"Charles"),(4L,"Diane"),(5L,"Went to gym this morning")))
 val myEdges = sc.makeRDD(Array(Edge(1L,2L,"is-frlends-with"),Edge(2L,3L,"is-friends-with"),Edge(3L,4L,"is-friends-with"),Edge(4L,5L,"Likes-status"),Edge(3L,5L,"Wrote-status")))
 val myGraph = Graph(myVertices,myEdges)
 myGraph.vertices.collect

 

 

我们就得出了构造图!!!!

 myGraph.edges.collect//得出边的集合
 ​

 

 可以使用triplets()方法,根据Vertexrd将顶点和边联合在一起。Graph
 本来是将数据分开存储在对应的边RDD 和顶点RDD 内,triplets()函数只不过
 是方便地将它们联合在一起,
 myGraph.triplets.collect//获取triplets图数据
 ​

 

我们也可以对图进行修改,比如加入一些布尔值的限定条件;

 

 

 scala> myGraph.mapTriplets(t=>(t.attr,t.attr == "is-friends-with" && t.srcAttr.toLowerCase.contains("a"))).triplets.collect
 需要满足两个条件,第一个,字符串有“是朋友”,第二个,字符有小写a

 

举报

相关推荐

0 条评论