Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在Spark Graphx中查找连接到特定节点的间接节点_Apache Spark_Spark Graphx - Fatal编程技术网

Apache spark 如何在Spark Graphx中查找连接到特定节点的间接节点

Apache spark 如何在Spark Graphx中查找连接到特定节点的间接节点,apache-spark,spark-graphx,Apache Spark,Spark Graphx,我想找到连接到特定节点的间接节点。 我试着使用图的连通组件类,如下所示 graph.connectedComponents 但是,它给出了所有的图。但是我想要一个特定的节点 我也试过像下面这样做 graph.edges.filter(_.srcId == x).map(_.dstId) 这给出了一个特定节点的直接节点,我只能通过使用RDD操作来递归它。 有人能帮忙吗?试试这样的方法: graph.edges.filter(_.srcId == x).map(e => (e.dstId,

我想找到连接到特定节点的间接节点。 我试着使用图的连通组件类,如下所示

graph.connectedComponents
但是,它给出了所有的图。但是我想要一个特定的节点

我也试过像下面这样做

graph.edges.filter(_.srcId == x).map(_.dstId)
这给出了一个特定节点的直接节点,我只能通过使用RDD操作来递归它。
有人能帮忙吗?

试试这样的方法:

graph.edges.filter(_.srcId == x).map(e => (e.dstId, null)).join(
  graph.collectNeighborIds(EdgeDirection.Either)
).flatMap{t => t._2._2}.collect.toSet
如果您想更深入地了解这一点,我将使用类似于的内容。本质上,它允许您在节点之间重复发送消息并聚合结果

编辑:Pregel解决方案

我终于让迭代自行停止编辑下面的。给定此图:

graph.vertices.collect
res46: Array[(org.apache.spark.graphx.VertexId, Array[Long])] = Array((4,Array()), (8,Array()), (1,Array()), (9,Array()), (5,Array()), (6,Array()), (2,Array()), (3,Array()), (7,Array()))    

graph.edges.collect
res47: Array[org.apache.spark.graphx.Edge[Double]] = Array(Edge(1,2,0.0), Edge(2,3,0.0), Edge(3,4,0.0), Edge(5,6,0.0), Edge(6,7,0.0), Edge(7,8,0.0), Edge(8,9,0.0), Edge(4,2,0.0), Edge(6,9,0.0), Edge(7,9,0.0))
我们将发送
Array[Long]
类型的消息——一个包含所有连接节点的
vertexid
的数组。消息将向上游发送--
dst
将发送
src
及其
VertexId
以及所有其他下游
VertexId
。如果上游节点已经知道连接,则不会发送任何消息。最终,每个节点都知道每个连接的节点,不再发送消息

首先,我们定义我们的
vprog
。根据文件:

用户定义的顶点程序,在每个顶点上运行并接收 输入消息并计算新的顶点值。一开始 迭代顶点程序在所有顶点上调用并传递 默认消息。在随后的迭代中,顶点程序是 仅在接收消息的顶点上调用

然后我们定义我们的
sendMsg
--编辑:交换的
src
&
dst

一种用户提供的函数,应用于 在当前迭代中收到的消息

接下来我们的
mergeMsg

一种用户提供的函数,接收两条a类型的传入消息 并将它们合并到a类型的单个消息中。此函数必须 交换的和结合的,理想情况下A的大小不应该 增加

不幸的是,我们要打破上面最后一句的规定:

def mergeMsg(a: Array[Long], b: Array[Long]) : Array[Long] = {
  (a ++ b).toSet.toArray
}
然后我们运行
pregel
--编辑:删除
maxIterations
,默认为
Int.MaxValue

val result = graph.pregel(Array[Long]())(vprog, sendMsg, mergeMsg)
你可以看看结果:

result.vertices.collect
res48: Array[(org.apache.spark.graphx.VertexId, Array[Long])] = Array((4,Array(4, 2, 3)), (8,Array(8, 9)), (1,Array(1, 2, 3, 4)), (9,Array(9)), (5,Array(5, 6, 9, 7, 8)), (6,Array(6, 7, 9, 8)), (2,Array(2, 3, 4)), (3,Array(3, 4, 2)), (7,Array(7, 8, 9)))

好。这当然不是一个简单的问题。有一个
aggregateMessages
API你应该看看,还有一个叫做
Pregel
的算法你可以使用。本质上,它允许您在节点之间重复发送消息并聚合结果。在注释中很难解释——但是想象一下,在算法的第一次迭代中,节点7将向节点2发送(8,9),节点8将向节点7发送(10,11)。然后在第二次迭代中,节点7将向节点2发送(10,11)。所以Pregel的两次迭代你有你的答案。当然,大卫。我会处理这个问题…并会更新你。。。Thanks@DavidGriffin我有一个类似的问题:-顶点数组[(org.apache.spark.graphx.VertexId,org.apache.spark.sql.Row)]-边数组[org.apache.spark.graphx.Edge[org.apache.spark.sql.Row]]。在行(顶点)中还有一个哈希标记数组。我会从具有特定哈希标记的节点开始计算路径中的间接和直接节点,但我不知道路径长度。嗨,David…我在群集中使用上述代码处理其他数据时遇到空指针异常…请您帮助我如何摆脱空指针异常…在Pregel中…在下面使用时行。。。val result=graph.pregel(数组[Long]())(vprog、sendMsg、mergeMsg)如何定义其他数据?您是否以编程方式生成它?如果是,请张贴代码?
val result = graph.pregel(Array[Long]())(vprog, sendMsg, mergeMsg)
result.vertices.collect
res48: Array[(org.apache.spark.graphx.VertexId, Array[Long])] = Array((4,Array(4, 2, 3)), (8,Array(8, 9)), (1,Array(1, 2, 3, 4)), (9,Array(9)), (5,Array(5, 6, 9, 7, 8)), (6,Array(6, 7, 9, 8)), (2,Array(2, 3, 4)), (3,Array(3, 4, 2)), (7,Array(7, 8, 9)))