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

les*_*chu 6 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
Run Code Online (Sandbox Code Playgroud)

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

a  -> e  44
a  -> d  34
Run Code Online (Sandbox Code Playgroud)

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

zer*_*323 2

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

graphframes:graphframes:0.2.0-spark2.0-s_2.11
Run Code Online (Sandbox Code Playgroud)

将其作为 的参数spark.jars.packages传入conf/spark-defaults.conf或传递。--packagesspark-submit

接下来您应该转换GraphGraphFrame. 您可以使用fromGraphX方法:

graphframes:graphframes:0.2.0-spark2.0-s_2.11
Run Code Online (Sandbox Code Playgroud)

GraphFrame提供 find 方法,该方法采用类似于 Cypher 的语言中的模式。两跳可以表示为:

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)
Run Code Online (Sandbox Code Playgroud)

其中(_)代表节点和[_]边。与模式匹配的路径:

val pattern = "(x1) - [a] -> (x2); (x2) - [b] -> (x3)"
Run Code Online (Sandbox Code Playgroud)

select字段:

val paths = graphFrame.find(pattern)
Run Code Online (Sandbox Code Playgroud)