gpt4 book ai didi

scala - 如何过滤相邻顶点类型的混合节点图

转载 作者:行者123 更新时间:2023-12-01 10:40:47 25 4
gpt4 key购买 nike

这个问题是关于 Spark GraphX 的。我想通过删除与某些其他节点相邻的节点来计算子图。

示例

[任务] 保留与C2节点不相邻的A节点和B节点。

输入图:

                    ┌────┐
┌─────│ A │──────┐
│ └────┘ │
v v
┌────┐ ┌────┐ ┌────┐ ┌────┐
│ C1 │────>│ B │ │ B │<────│ C2 │
└────┘ └────┘ └────┘ └────┘
^ ^
│ ┌────┐ │
└─────│ A │──────┘
└────┘

输出图:

         ┌────┐
┌─────│ A │
│ └────┘
v
┌────┐
│ B │
└────┘
^
│ ┌────┐
└─────│ A │
└────┘

如何优雅地编写返回输出图的 GraphX 查询?

最佳答案

使用 GraphOps.collectNeighbors 查找 val nodesAB 的不同方法

val nodesAB = graph.collectNeighbors(EdgeDirection.Either)
.filter{case (vid,ns) => ! ns.map(_._2).contains("C2")}.map(_._1)
.intersection(
graph.vertices
.filter{case (vid,attr) => ! attr.toString.startsWith("C") }.map(_._1)
)

其余的工作方式与您相同:

val solution1 = Graph(nodesAB, graph.edges) .
subgraph(vpred = {case(id, label) => label != null})

如果你想使用可能(?)更具可扩展性的 DataFrame,那么首先我们需要将 nodesAB 转换为 DataFrame:

val newNodes = sqlContext.createDataFrame(
nodesAB,
StructType(Array(StructField("newNode", LongType, false)))
)

然后你创建了 DataFrame 并以此为边缘:

val edgeDf = sqlContext.createDataFrame(
graph.edges.map{edge => Row(edge.srcId, edge.dstId, edge.attr)},
StructType(Array(
StructField("srcId", LongType, false),
StructField("dstId", LongType, false),
StructField("attr", LongType, false)
))
)

然后您可以这样做来创建没有子图的图:

val solution1 = Graph(
nodesAB,
edgeDf
.join(newNodes, $"srcId" === $"newNode").select($"srcId", $"dstId", $"attr")
.join(newNodes, $"dstId" === $"newNode")
.rdd.map(row => Edge(row.getLong(0), row.getLong(1), row.getLong(2)))
)

关于scala - 如何过滤相邻顶点类型的混合节点图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30325316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com