发布日期:2022-08-09
VIP内容
构建子图
GraphFrames提供了通过对边和顶点进行过滤来构建子图的API。这些过滤器可以组合在一起来使用。例如,构建只包含年龄在30岁以上的朋友的子图,代码如下:
// 选择用户年龄超过30岁,并且边的类型是"friend"的子图
val g2 = g
.filterEdges("relationship = 'friend'")
.filterVertices("age > 30")
.dropIsolatedVertices()
g2.vertices.show()
g2.edges.show()
输出结果如下:
+---+------+---+--------+----------+ | id| name|age| cash| fruit| +---+------+---+--------+----------+ | a| Alice| 34| 234| Apples| | b| Bob| 36| 23232323| Bananas| | e|Esther| 32| 1|Watermelon| +---+------+---+--------+----------+ +---+---+------------+ |src|dst|relationship| +---+---+------------+ | a| b| friend| | a| e| friend| +---+---+------------+
这个例子中,分别使用filterVertices()方法和filterEdges()方法过滤顶点和边用来创建子图。在最后对子图调用dropIsolatedVertices()方法,删除孤立的没有连接的点。
基于motif查找和DataFrame过滤器的组合,GraphFrames提供了一种强大的方式来选择子图。例如,基于在边及其src和dst顶点上操作的三重过滤器来选择子图,代码如下:
// 根据类型"follow"的边"e"来选择子图
// 从年轻的用户"a"指向较年长的用户"b"
val paths = g.find("(a)-[e]->(b)")
.filter("e.relationship = 'follow'")
.filter("a.age < b.age")
// "paths"包含顶点信息。提取边
val e2 = paths.select("e.src", "e.dst", "e.relationship")
// 在Spark 1.5+, 用户可以简化这个调用:
// val e2 = paths.select("e.*")
// 构造子图
val g2 = GraphFrame(g.vertices, e2)
g2.vertices.show()
g2.edges.show()
执行上面的代码,输出结果如下:
+---+-------+---+--------+----------+ | id| name|age| cash| fruit| +---+-------+---+--------+----------+ | a| Alice| 34| 234| Apples| | b| Bob| 36| 23232323| Bananas| | c|Charlie| 30| 2123|Grapefruit| | d| David| 29| 2321111| Bananas| | e| Esther| 32| 1|Watermelon| | f| Fanny| 36| 333| Apples| | g| Gabby| 60| 23433| Oranges| +---+-------+---+--------+----------+ +---+---+------------+ |src|dst|relationship| +---+---+------------+ | c| b| follow| | e| f| follow| +---+---+------------+
在上述示例的执行过程为:
- (1) 首先用(a)-[e]->(b)过滤出所有连接的顶点,得到顶点数据集。
- (2) 使用条件过滤指定关系follow和节点年龄的大小关系,得到一个边的数据集。
- (3) 将顶点和边的数据集传入GraphFrame可以得到一个子图。
通过使用更复杂的motif将这个例子扩展到三重之外是很简单的。