我的spark/databricks使用graphframes来查找连接组件中顶点之间的最短路径。算法在几分钟后失败 org.graphframes.NoSuchVertexException: GraphFrame algorithm given vertex ID which does not exist in Graph. Vertex ID 1 not contained in GraphFrame
.
错误消息完全不相关-两个图的顶点都不包含 id == 1
非边缘
src dst
做。算法根本不应该寻找这样的id。我想知道是否有尺寸限制 shortestPaths
失败或者我遗漏了定义的其他部分。
代码非常简单:
val sp14754224 = g54.shortestPaths.landmarks("14754224").run
图形结构也很基本:
e54:org.apache.spark.sql.DataFrame
src:integer
dst:integer
edgeRevenue:double
edgeAgreements:double
v54:org.apache.spark.sql.DataFrame
id:integer
Name:string
vertexRevenue:double
vertexDealss:long
图形本身相对较大(31342个顶点和1027724条边),但它只是以前由 connectedComponets
. 内存消耗似乎也没有问题(观察到的峰值约为20gb,而每个工人有64gb)。
有什么建议吗?
2条答案
按热度按时间wnavrhmk1#
我相信地标应该是一个序列,试试这个:
val sp14754224=g54.shortestpaths.landmarks(seq(“14754224”))。运行
我想知道是否有一些转换正在进行,因此您的字符串可能会变成seq[char],从而导致vertex 1错误。
mwg9r5ms2#
从未在spark/scala中找到解决方案,但使用spark r有一个简单的解决方法:
切换到r(创建r笔记本或使用
%r
; 无论哪种方式,输入数据都必须从存储器中读取)安装
iGraph
以及SparkR
群集中的库收集顶点和边以获得r
data.frame
应用iGraph
方法(例如最短路径)图形数据必须符合司机的记忆,这是我的问题的任务的情况。
代码示例:
igraph比graphx/graphframe具有更广泛的功能。只要图形数据适合内存,它的执行速度也会更快。如果graph太大,请考虑首先使用graphframe的连接组件,然后分别处理每个组件,通过调用igraph的功能
gapply
按每个组件id。