GraphFrames简介

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读写图。

一个社交网络的例子

假设我们有一个社交网络,用户之间有相互联系,我们通过有顶点集合(用户)和边的集合(用户之间的关系)的图来展示网络,下面是一个简单的例子。
social_network_graph_diagram
我们可能会问问题诸如“哪个用户最有影响力?”或者“用户A和用户B相互不认识,是否应该介绍他们相互认识?”这种类型的问题能通过图查询和算法来回答。GraphFrames能存储节点和边的数据,在社交网络中,每个用户能存储年龄和姓名,并且每个连接都有关系的类型。
social_network_graph_edges
social_network_graph_verticies
简单的图查询非常容易。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)
PageRank_results

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)
GraphFrames_motif_findings
所有的GraphX算法集合中被GraphFrame支持有:

  • PageRank:发现最图中重要的节点。
  • 最短路径:查找每个节点到目标节点的最短路径。
  • 连通分支:一组节点形成联通子图。
  • 三角计数:计算每个节点都是三角形的一部分的总节点数。
  • 标签传播算法:检测图中的社区。

GraphFrames和GraphX集成

GraphFrames和GraphX通过两种展示相互转化,而不带来信息丢失。我们我们可以使用下面的代码将GraphFrame转化为GraphX,并转化回来。
val gx:Graph[Row,Row]=g.toGraphX()
val g2:GraphFrame=GraphFrame.fromGraphX(gx)
本文属于译文,原文出处。更多的GraphFrame的API文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值