GraphFrames是Apache Spark上的图处理框架。
目前博主知道的三种方式是
1.目前GraphFrames库还没有并入Spark项目中,使用该库时,要安装GraphFrames包:
$pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11
2.使用SparkConf的spark.jars.packages属性指定依赖包:
from pyspark import SparkConf
conf = SparkConf().set('spark.jars.packages'
,'graphframes:graphframes:0.5.0-spark2.1-s_2.11')
3.在SparkSession中配置:(Spark2.x版本)
from pyspark.sql import SparkSession
spark = SparkSession.builder.config('spark.jars.packages' ,'graphframes:graphframes:0.5.0-spark2.1-s_2.11') .getOrCreate()
博主使用的就是第一种,这里附上图例
具体下包的过程图是这样的,嗯一共五个modules,其中scala-lang是需要较长时间的,请忽略本人的渣渣网速,诶
最后再温馨提示一下新手小白,第三种配置需要注意spark的版本,1.0的版本的话可能会出现报错现象,继续往下演示。
GraphFrame是GraphFrames API的核心抽象编程模型,是图的抽象。
>>> from graphframes import *
>>> vertices = spark.createDataFrame([ ("a", "Alice", 34),("b", "Bob", 36)] , ["id", "name", "age"])
>>> edges = spark.createDataFrame([ ("a", "b", "friend")] , ["src", "dst", "relationship"])
>>> from graphframes import GraphFrame
>>> graph = GraphFrame(vertices,edges)
图例如下:
这里习惯性的查看一下具体的方法名有哪些,有兴趣的童鞋最好研读一下文档或者案例
GraphFrames用户指南-Python — Databricks文档.
graph.Vertices.show()
graph.edges.show()
graph.triplets.show()
>> graph.vertices.show()
+---+-----+---+
| id| name|age|
+---+-----+---+
| a|Alice| 34|
| b| Bob| 36|
+---+-----+---+
#顶点表视图
>> graph.edges.show()
+---+---+------------+
|src|dst|relationship|
+---+---+------------+
| a| b| friend|
+---+---+------------+
#边表视图
>> graph.triplets.show()
+--------------+--------------+-----------+
| src| edge| dst|
+--------------+--------------+-----------+
|[a, Alice, 34]|[a, b, friend]|[b, Bob, 36]|
+--------------+--------------+-----------+
#三元组(Triplet)视图
代码片如下:
>>> graph.degrees.show()
+---+------+
| id|degree|
+---+------+
| b| 1|
| a| 1|
+---+------+
#degrees顶点的度
>> graph.inDegrees.show()
+---+--------+
| id|inDegree|
+---+--------+
| b| 1|
+---+--------+
#inDegrees顶点的入度
>> graph.outDegrees.show()
+---+---------+
| id|outDegree|
+---+---------+
| a| 1|
+---+---------+
#outDegrees顶点的出度
采用形如“(a)-[e]->(b)”的模式描述有向边
>>> motifs = graph.find("(a)-[e]->(b)")
>>> motifs.show()
模式视图是DataFrame类型的,同样可以进一步进行查询、过滤和统计操作。
>>> motifs.filter("b.age > 30").show()
这里由于示例的图比较简单,所以过滤出来的效果跟find()的结果一样,可以尝试构建更复杂的有向图、无向图、二分图、多重图等尝试进行查询操作,更进一步的理解和掌握。
图可以以多种格式进行保存,例如:
>>> graph.vertices.write.parquet("hdfs://xdata-m1:8020/user/ua50/vertices")
>>> graph.edges.write.parquet("hdfs://xdata-m1:8020/user/ua50/edges")
#注意这个保存路径是hdfs的
博主演示的是保存在linux下的,注意图保存的是文件夹,如下图:
graph.vertices.write.json("/home/hadoop/spark-graphX/vertices_json")
>>>ls
>>>part-00000-7a9d9acc-50a6-43ec-8b4b-3f29e8546a98-c000.json _SUCCESS
>>> v = spark.read.parquet("hdfs://xdata-m1:8020/user/ua50/vertices")
>>> e = spark.read.parquet("hdfs://xdata-m1:8020/user/ua50/edges")
>>> newGraph=GraphFrame(v, e)
图加载可以理解为对图的顶点和边的持久化,可以随时调用和加载。
Spark-GraphX图计算入门示例到此尾声,如有纰漏,欢迎各位指出~