如何在spark-graphx中获得两跳邻居?

时间:2016-10-08 04:31:50

标签: apache-spark spark-graphx

我使用graphx创建了有向图。

#src->dest
a  -> b  34
a  -> c  23
b  -> e  10
c  -> d  12
d  -> c  12
c  -> d  11

我想得到这样的所有两个跳邻居:

a  -> e  44
a  -> d  34

我的图表非常大,所以我想优雅高效地完成这项工作。 有没有人对图形实例的最佳方法有什么建议?

1 个答案:

答案 0 :(得分:2)

您可以使用GraphFrames库简洁地表达这一点。首先,您必须包含所需的包。对于Spark 2.0和Scala 2.11,您可以添加

graphframes:graphframes:0.2.0-spark2.0-s_2.11

转到spark.jars.packages中的conf/spark-defaults.conf,或将其作为--packages的{​​{1}}参数传递。

接下来,您应该将spark-submit转换为Graph。您可以使用GraphFrame方法:

fromGraphX

import org.graphframes.GraphFrame import org.apache.spark.graphx._ val nodes = sc.parallelize(Seq( (1L, "a"), (2L, "b"), (3L, "c"), (4L, "d"), (5L, "e"))) val edges = sc.parallelize(Seq( Edge(1L, 2L, 34), Edge(1L, 3L, 23), Edge(2L, 5L, 10), Edge(3L, 4L, 12), Edge(3L, 3L, 12), Edge(3L, 5L, 11))) val graph = Graph(nodes, edges) val graphFrame = GraphFrame.fromGraphX(graph) 提供了find方法,该方法采用类似于Cypher的语言模式。两跳可以表示为:

GraphFrame

其中val pattern = "(x1) - [a] -> (x2); (x2) - [b] -> (x3)" 代表节点,(_)代表边缘。您匹配模式的路径:

[_]

val paths = graphFrame.find(pattern) 字段:

select