scala - 在 Spark GraphX 中更新节点属性的最佳结构是什么?
问题描述
有一段时间我正在寻找一种方法来更新 GraphX 中的节点属性。我正在研究一个由节点和节点属性组成的图。例如 (1,(2,true))。在这个例子中,1 是 nodeID,2 是节点的标签,true 代表节点被访问的时间。我已经用 GraphLoader 加载了图表,并通过 RDD 制作了一个分布式图表。
我为每个节点使用的结构如下:
case class nodes_properties(label: Int, isVisited: Boolean = false)
var work_graph = graph.mapVertices { case (node, property) => nodes_properties(node.toInt, false) }.cache()
当我想更新节点属性(例如它的标签)时,我使用以下结构:
work_graph = work_graph.mapVertices((vid: VertexId, v: nodes_properties) => {
if (vid == my_node) nodes_properties(newLabel,true)
else v
})
这个结构可以满足我的需求,但正如我所见,它的计算成本非常高,仅对于具有 30000 个节点的图,它需要大约 4 分钟,而当我使用 MATLAB 执行相同的操作时,大约需要 25 秒。
问题:在算法过程中是否有任何好的结构或任何有效和理想的方法来更新图中节点的属性?这对我来说真的是一个瓶颈,我无法解决这个问题。
我应该提到该算法具有迭代性质,并且在每次迭代中我需要根据某些条件更新节点属性。
注意:我使用unpersistVertices()
并且graph.checkpoint()
再次使用这种方法更新节点属性非常耗时!
解决方案
推荐阅读
- c++ - 我对下面 [dcl.enum]/5 (5.3) 中的“否则”一词的解释是否正确?
- excel - 如何根据一系列单元格打开和关闭多个 Excel 工作簿
- excel - 当单元格已包含该列表中的值时,如何从单元格的验证列表中删除项目?
- mysql - 使用单个表单将数据保存到两个表
- pyspark - 如何在 AWS Glue 作业中附加带有源名称的新列?
- dialogflow-es - 如何匹配当前或最新的问题
- javascript - 模态弹出窗口无法正常工作(希望背景页面变暗)
- batch-file - 链接批处理脚本时出现意外的双 & 符号/管道行为
- python - 获取最大频率项及其对应的编号
- firebase - 向已注册的第三方前端应用程序发出 API 访问权限