基于pyspark图计算的算法实例

引入

图算法指利用特制的线条算图求得答案的一种简便算法。无向图、有向图和网络能运用很多常用的图算法,这些算法包括:各种遍历算法(这些遍历类似于树的遍历),寻找最短路径的算法,寻找网络中最低代价路径的算法,回答一些简单相关问题(例如,图是否是连通的,图中两个顶点间的最短路径是什么,等等)的算法。图算法可应用到多种场合,例如:优化管道、路由表、快递服务、通信网站等。

GraphFrames提供与GraphX相同的标准图形算法套件以及一些新的算法。
目前,某些算法由GraphX的API实现的,因此在GraphFrames中可能没有比GraphX更可扩展的功能。

目前,我们的业务涉及到企业知识图谱,需要做路径搜索、社区发现、标签传播等基于图计算的应用,虽然neo4j也可以做,但是neo4j的分布式版本价格很高。于是考虑使用spark做分布式的图计算。

本文不介绍太多算法细节,主要展示官网和实际案例的代码实现。

广度优先搜索

广度优先搜索(Breadth-first search,简称BFS),是查找一个顶点到另外一个顶点的算法。
这里是用pyspark自带的friends数据集,实现路径搜索。
我们先看看friends数据集长啥样。

from pyspark import SparkContext
from pyspark.sql import SQLContext
from graphframes.examples import Graphs

# spark
sc = SparkContext("local", appName="mysqltest")
sqlContext = SQLContext(sc)
g = Graphs(sqlContext).friends()
g.vertices.show()
g.edges.show()

有7个节点代表7个人,然后用7个关系展示他们的人际关系,有friend和follow两种关系。

+---+-------+---+
| id|   name|age|
+---+-------+---+
|  a|  Alice| 34|
|  b|    Bob| 36|
|  c|Charlie| 30|
|  d|  David| 29|
|  e| Esther| 32|
|  f|  Fanny| 36|
+---+-------+---+

+---+---+------------+
|src|dst|relationship|
+---+---+------------+
|  a|  b|      friend|
|  b|  c|      follow|
|  c|  b|      follow|
|  f|  c|      follow|
|  e|  f|      follow|
|  e|  d|      friend|
|  d|  a|      friend|
+---+---+------------+

在这里插入图片描述
然后用BFS的API来做路径搜索,分别定义起点和终点的条件。

paths = g.bfs("name = 'Esther'", "age < 32")
paths.show()
+---------------+--------------+--------------+
|           from|            e0|            to|
+---------------+--------------+--------------+
|[e, Esther, 32]|[e, d, friend]|[d, David, 29]|
+---------------+--------------+--------------+

可以看到,满足节点名称为Esther的有两条关系,但指向节点age小于32的只有David了,如图所示。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
广度优先搜索(BFS)算法是一种用于查找一个顶点到另外一个顶点的路径的算法。在pyspark中,可以使用处理库graphframes的friends数据集来实现路径搜索。friends数据集包含了的顶点和边的信息。可以使用以下代码来加载和展示friends数据集: ```python from pyspark import SparkContext from pyspark.sql import SQLContext from graphframes.examples import Graphs # 创建SparkContext和SQLContext sc = SparkContext("local", appName="mysqltest") sqlContext = SQLContext(sc) # 加载friends数据集 g = Graphs(sqlContext).friends() # 展示顶点和边的信息 g.vertices.show() g.edges.show() ``` 标签传播算法(LPA)是一种用来检测网络中社区的算法。在pyspark中,可以使用处理库graphframes的labelPropagation方法来执行标签传播算法。以下是一个示例代码: ```python from pyspark import SparkContext from pyspark.sql import SQLContext from graphframes import GraphFrame from graphframes.examples import Graphs # 创建SparkContext和SQLContext sc = SparkContext("local", appName="mysqltest") sqlContext = SQLContext(sc) # 加载friends数据集 g = Graphs(sqlContext).friends() # 执行标签传播算法 result = g.labelPropagation(maxIter=5) # 展示节点的id和标签 result.select("id", "label").show() ``` 强连通分量是对的可连通性进行标记的方法。在pyspark中,可以使用处理库graphframes的stronglyConnectedComponents方法来计算强连通分量。以下是一个示例代码: ```python from pyspark import SparkContext from pyspark.sql import SQLContext from graphframes import GraphFrame from graphframes.examples import Graphs # 创建SparkContext和SQLContext sc = SparkContext("local", appName="mysqltest") sqlContext = SQLContext(sc) # 加载friends数据集 g = Graphs(sqlContext).friends() # 计算强连通分量 result = g.stronglyConnectedComponents(maxIter=10) # 展示节点的id和所属的连通分量 result.select("id", "component").orderBy("component").show() ``` 通过使用pyspark中的graphframes库,可以实现基于pyspark的广度优先搜索、标签传播和强连通分量等算法的应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于pyspark计算算法实例](https://blog.csdn.net/weixin_39198406/article/details/104940179)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值