当前位置: 首页 > news >正文

pyspark使用 graphframes创建和查询图的方法

1、安装graphframes的步骤

1.1 查看 spark 和 scala版本

在终端输入: spark-shell --version 查看spark 和scala版本

1.2 在maven库中下载对应版本的graphframes

https://mvnrepository.com/artifact/graphframes/graphframes

我这里需要的是spark 2.4 scala 2.11版本

https://mvnrepository.com/artifact/graphframes/graphframes/0.8.0-spark2.4-s_2.11

1.3 在pyspark的环境中配置graphframe的jar包

os.environ['PYSPARK_PYTHON'] = 'Python3.7/bin/python'
os.environ['PYSPARK_SUBMIT_ARGS'] = '--jars graphframes-0.8.1-spark2.4-s_2.11.jar pyspark-shell'spark = SparkSession \.builder \.appName("read_data") \.config('spark.pyspark.python', 'Python3.7/bin/python') \.config('spark.yarn.dist.archives', 'hdfs://ns62007/user/dmc_adm/_PYSPARK_ENV/Python3.7.zip#Python3.7') \.config('spark.executorEnv.PYSPARK_PYTHON', 'Python3.7/bin/python') \.config('spark.sql.autoBroadcastJoinThreshold', '-1') \.enableHiveSupport() \.getOrCreate()spark.sparkContext.addPyFile('graphframes-0.8.1-spark2.4-s_2.11.jar')

2、导入GraphFrame创建图

2.1 导入包使用

from graphframes import GraphFrame

2.2 创建图的例子

from pyspark.sql.types import *
import pandas as pd
from graphframes import GraphFrame#创建图的方法1
v = spark.createDataFrame([("a", "Alice", 34),("b", "Bob", 36),("c", "Charlie", 30),
], ["id", "name", "age"])# Create an Edge DataFrame with "src" and "dst" columns
e = spark.createDataFrame([("a", "b", "friend"),("b", "c", "follow"),("c", "b", "follow"),
], ["src", "dst", "relationship"])
# Create a GraphFrame
g = GraphFrame(v, e)# Query: Get in-degree of each vertex.
g.inDegrees.show()

也可以简单化顶点和边:

#创建图的方法2
edges_df= spark.createDataFrame([("a", "b"),("b", "c"),("c", "b"),
], ["src", "dst"])
nodes_df=spark.createDataFrame([(1, "a"),(2, "b"),(3, "c")
], ["num","id"])graph=GraphFrame(nodes_df, edges_df)
graph.inDegrees.show()

3、使用GraphFrame查看图

3.1 找出age属性最小的顶点
# 你可以像使用 dataframe一样来使用 graphframe!!!!
g.vertices.groupBy().min("age").show()

3.2 过滤顶点和边,创建子图
# 直接用filterVertices和filterEdges过滤顶点和边用来创建子图
g1.filterVertices("age > 30").filterEdges("relationship = 'friend'").vertices.show()
g1.filterVertices("age > 30").filterEdges("relationship = 'friend'").dropIsolatedVertices().vertices.show()

 3.3 也可以像dataframe一样过滤顶点和边
g.vertices.where(col("id")=="a").show()
print(g.vertices.where(col("age")==34).count())g.edges.show()
g.edges.where(col("src")>col("dst")).show()

3.4 路径搜索和筛选
# 路径搜索
paths = g.find("(a)-[e]->(b)")
paths.show()# 路径搜索 和筛选
path = g.find("(a)-[e]->(b)")\.filter("e.relationship = 'follow'")\.filter("a.age < b.age")
path.show()

3.5 计算BFS
# 计算bfs
res = g1.bfs("id='b'","id<>'b'")
res.select([column for column in res.columns]).show()
3.6 查看关系数据集中的列
# 选择关系数据集中的列
e2 = paths.select("e.src", "e.dst", "e.relationship")
e2.show()
3.7 使用顶点和边的集合构造子图
# 使用顶点和边的集合构造子图
g2 = GraphFrame(g.vertices, e2)
g2.vertices.show()
g2.edges.show()

3.8 统计符合条件的边和顶点个数
# Query: Count the number of "follow" connections in the graph.
t = g.edges.filter("relationship = 'follow'").count()
print(t)print(g.vertices.where(col("age")==34).count())
3.9 计算每个节点的入度和出度
from pyspark.sql import functions as F
# 计算每个节点的入度和出度
in_degrees = g.inDegrees
out_degrees = g.outDegrees# 找到具有最大入度的节点
max_in_degree = in_degrees.agg(F.max("inDegree")).head()[0]
node_with_max_in_degree = in_degrees.filter(in_degrees.inDegree == max_in_degree).select("id")# 找到具有最大出度的节点
max_out_degree = out_degrees.agg(F.max("outDegree")).head()[0]
node_with_max_out_degree = out_degrees.filter(out_degrees.outDegree == max_out_degree).select("id")# 打印结果
node_with_max_in_degree.show()
node_with_max_out_degree.show()
3.10 计算顶点的pagerank
# Run PageRank algorithm, and show results.
results = g.pageRank(resetProbability=0.01, maxIter=5)
results.vertices.select("id", "pagerank").show()
results.vertices.show()

4、graphframes和spark 的graphX的区别

GraphX - Spark 2.3.0 Documentation

GraphFrames,该类库是构建在Spark DataFrames之上,它既能利用DataFrame良好的扩展性和强大的性能,同时也为Scala、Java和Python提供了统一的图处理API。GraphX基于RDD API,不支持Python API; 但GraphFrame基于DataFrame,并且支持Python API。

目前GraphFrames还未集成到Spark中,而是作为单独的项目存在。GraphFrames遵循与Spark相同的代码质量标准,并且它是针对大量Spark版本进行交叉编译和发布的。

与Apache Spark的GraphX类似,GraphFrames支持多种图处理功能,有下面几方面的优势:

1、统一的 API: 为Python、Java和Scala三种语言提供了统一的接口,这是Python和Java首次能够使用GraphX的全部算法。

2、强大的查询功能:GraphFrames使得用户可以构建与Spark SQL以及DataFrame类似的查询语句。

3、图的存储和读取:GraphFrames与DataFrame的数据源完全兼容,支持以Parquet、JSON以及CSV等格式完成图的存储或读取。

  在GraphFrames中图的顶点(Vertex)和边(Edge)都是以DataFrame形式存储的,所以一个图的所有信息都能够完整保存。

4、GraphFrames可以实现与GraphX的完美集成。两者之间相互转换时不会丢失任何数据。

5、书:图算法《Graph Algorithm》

O'Reilly free ebook《Graph Algorithm - Practical Examples in Apache Spark and Neo4j

作者 Mark Needham & Amy E. Hodler

书旨在围绕这些重要的图分析类型,包括算法、概念、算法在机器学习上的实际应用,来扩展我们的知识和能力。从基本概念到基本算法,从处理平台和实际用例,作者为图的精彩世界编制了一份具有启发性和说明性的指南。

《图算法》第四章-1 路径查找和图搜索算法

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Maven settings.xml 私服上传和拉取配置
  • 有效应对服务器遭受CC攻击的策略与实践
  • 鸿蒙特色物联网实训室
  • 【网络安全的神秘世界】Error:Archives directory /var/cache/apt/archives/partial is missing.
  • react + pro-components + ts完成单文件上传和批量上传
  • CVE-2024-24549 Apache Tomcat - Denial of Service
  • Golang | Leetcode Golang题解之第241题为运算表达式设计优先级
  • Java面试题--JVM大厂篇之Serial GC在JVM中有哪些优点和局限性
  • 数据库建立中间表的意义
  • 【D3.js in Action 3 精译_018】2.4 向选择集添加元素
  • WordPress杂技
  • kotlin get set
  • RabbitMQ发布确认及交换机类型
  • SQL Server分布式查询:跨数据库的无缝数据探索
  • vite+vue3项目初始化搭建
  • php的引用
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《Java编程思想》读书笔记-对象导论
  • C++11: atomic 头文件
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • python学习笔记 - ThreadLocal
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 高性能JavaScript阅读简记(三)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 来,膜拜下android roadmap,强大的执行力
  • 微服务框架lagom
  • 微信小程序填坑清单
  • 转载:[译] 内容加速黑科技趣谈
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #Z2294. 打印树的直径
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core 外观者设计模式 实现,多种支付选择
  • .Net Core中Quartz的使用方法
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET性能优化(文摘)
  • /etc/skel 目录作用
  • @EnableWebMvc介绍和使用详细demo
  • @SuppressWarnings注解
  • [].slice.call()将类数组转化为真正的数组
  • [AIGC] SpringBoot的自动配置解析
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [BeginCTF]真龙之力
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • [JavaEE]线程的状态与安全
  • [javaSE] 数据结构(二叉查找树-插入节点)
  • [Json.net]快速入门