Spark-GraphFrames入门使用示例

GraphFrames简介

GraphFrames是Apache Spark上的图处理框架。

  • Pregel Google:内部的分布 式图计算框架
  • Giraph :运行在Hadoop之上的类 Pregel图计算框架
  • PowerGraph: 一个支持异步执行方式、利用 共享内存的并行图计算框架
  • Graphx: Spark平台下,面向大规 模图计算的组件

GraphFrames库的优势

  • 将Spark中的Graph算法统一到 DataFrame接口的Graph操作API接口
  • 强力的查询:项目托管在Github上,它基于DataFrame构建 [托管到GitHub上的好处,懂得都懂]
  • 基于Spark平台的并行图计算库,受益于DataFrame的高性能和可拓展性
  • 多语言支持:支持的语言包括Scala、Java、Python
  • 保存和载入图模型:GraphFrames完全支持DataFrame结构的数据源,允许使用熟悉的Parquet、JSON、和CSV读写图。

使用GraphFrames库

目前博主知道的三种方式是
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实例

GraphFrame是GraphFrames API的核心抽象编程模型,是图的抽象。

  • 顶点DataFrame:必须包含列名为“id”的列,作为顶点的唯一标识d表示顶点V队列
    G∈<V,E>
  • 边DataFrame:必须包含列名为“src”和“dst”的列,保存头和尾的唯一标识id

>>> 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文档.

视图和图操作

GraphFrame提供四种视图:返回类型都是DataFrame

  • 顶点表视图:graph.Vertices.show()
  • 边表视图:graph.edges.show()
  • 三元组(Triplet)视图:graph.triplets.show()
  • 模式(Pattern)视图

在这里插入图片描述
对应的代码片如下:

>> 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)视图

通过GraphFrame提供的三个属性:degrees、inDegrees、 outDegrees可以获得顶点的度、入度和出度。

代码片如下:

>>> 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()的结果一样,可以尝试构建更复杂的有向图、无向图、二分图、多重图等尝试进行查询操作,更进一步的理解和掌握。
在这里插入图片描述

加载和保存图

图保存

图可以以多种格式进行保存,例如:

  • csv/json/parquet/text
    想研究的童鞋可以看看write下的一些方法
    在这里插入图片描述
  • 示例代码片如下:
>>> graph.vertices.write.parquet("hdfs://xdata-m1:8020/user/ua50/vertices") 
>>> graph.edges.write.parquet("hdfs://xdata-m1:8020/user/ua50/edges")
#注意这个保存路径是hdfs的

博主演示的是保存在linux下的,注意图保存的是文件夹,如下图:

  • parquet的图保存
    在这里插入图片描述
    在这里插入图片描述
  • json的图保存,这个格式比较便于查看,请看下图
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图计算入门示例到此尾声,如有纰漏,欢迎各位指出~

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Klingx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值