Databricks公司宣布推出了Apache Spark上的图处理GraphFrames库,通过和UCB和MIT合作,他们基于DataFrames构建了一个图处理库,GraphFrames受益于DataFrames的高性能和可拓展性,也能提供一个统一的图处理API接口。支持的语言包括Scala、Java、Python。
什么是GraphFrames
GraphFrame支持通用的图处理,和Apache Spark的GraphX库很像,除此之外,GraphFrames基于Spark DataFrames构建,从而有以下几个优点。
- Python,Java和Scala API:GraphFrames为三种语言提供了通用的API接口。首次实现了所有在GraphX中实现的算法都能在python和Java中使用。
- 强力的查询:GraphFrames允许用于使用简短的查询,就像和Spark SQL和DataFrame中强力的查询语句一样。
- 保存和载入图模型:GraphFrames完全支持DataFrame结构的数据源,允许使用熟悉的Parquet、JSON、和CSV读写图。
一个社交网络的例子
假设我们有一个社交网络,用户之间有相互联系,我们通过有顶点集合(用户)和边的集合(用户之间的关系)的图来展示网络,下面是一个简单的例子。
我们可能会问问题诸如“哪个用户最有影响力?”或者“用户A和用户B相互不认识,是否应该介绍他们相互认识?”这种类型的问题能通过图查询和算法来回答。GraphFrames能存储节点和边的数据,在社交网络中,每个用户能存储年龄和姓名,并且每个连接都有关系的类型。
简单的图查询非常容易。GraphFrames使得通过图查询语句很容易表达。由于GraphFrames节点和边存储在DataFrames中,查询语句就是DataFrames(或者SQL)的查询。
- 比如查询:查询社交网络中多少用户年龄 超过35岁?我们可以使用下面的语句查询节点。g.vertices.filter(“age>35”)
- 查询多少用户至少有两个粉丝?我们也可以使用内置的inDegrees方法处理DataFrame的查询。g.inDegrees.filter(“inDegree>=2”)
图算法支持复杂的工作流
GraphFrame支持所有在GraphX中实现的算法。包括三种语言实现的API,图算法实现的结果可以是DataFrames或者GraphFrames,比如查询谁是最有影响力的用户时,我们可以使用PageRank进行查询。
results=g.pagerank(resetProbability=0.15,maxIter=10)
displya(results.vertices)
GraphFrames也支持很多新的算法:
- 宽度优先算法(BFS):查找节点之间的最短路径。
- Motif查找:在图中找到结构化的模式。
Motif查找能提供强力的查询,比如推荐感兴趣的人时,我们可能去搜索三个用户A、B、C,在这个关系中A关注了B、B关注了C但是A没有关注C。
# Motif: A->B->C but not A->C
results = g.find("(A)-[]->(B); (B)-[]->(C); !(A)-[]->(C)")
# Filter out loops (with DataFrame operation)
results = results.filter("A.id != C.id")
# Select recommendations for A to follow C results = results.select("A", "C") display(results)
所有的GraphX算法集合中被GraphFrame支持有:
- PageRank:发现最图中重要的节点。
- 最短路径:查找每个节点到目标节点的最短路径。
- 连通分支:一组节点形成联通子图。
- 三角计数:计算每个节点都是三角形的一部分的总节点数。
- 标签传播算法:检测图中的社区。
GraphFrames和GraphX集成
GraphFrames和GraphX通过两种展示相互转化,而不带来信息丢失。我们我们可以使用下面的代码将GraphFrame转化为GraphX,并转化回来。
val gx:Graph[Row,Row]=g.toGraphX()
val g2:GraphFrame=GraphFrame.fromGraphX(gx)
本文属于译文,原文出处。更多的GraphFrame的API文档。