编辑-我发现这本书是为scala写的 1.6
但剩下的是 2.11
.
我试图实现一个加权最短路径算法从迈克尔马拉克和罗宾东的 Spark GraphX in Action
书。这里讨论的部分是第6章的清单6.4“执行使用面包屑的最短路径算法”。
我有我自己的图表,我从两个RDD创建。有 344436
顶点和 772983
边缘。我可以使用本机graphx库执行未加权最短路径计算,并且我对图形构造很有信心。
在本例中,我使用他们的dijkstra实现,如下所示:
val my_graph: Graph[(Long),Double] = Graph.apply(verticesRDD, edgesRDD).cache()
def dijkstra[VD](g:Graph[VD,Double], origin:VertexId) = {
var g2 = g.mapVertices(
(vid,vd) => (false, if (vid == origin) 0 else Double.MaxValue, List[VertexId]())
)
for (i <- 1L to g.vertices.count-1) {
val currentVertexId = g2.vertices
.filter(!_._2._1)
.fold((0L, (false, Double.MaxValue, List[VertexId]())))(
(a,b) => if (a._2._2 < b._2._2) a else b)
)
._1
val newDistances = g2.aggregateMessages[(Double, List[VertexId])](
ctx => if (ctx.srcId == currentVertexId) {
ctx.sendToDst((ctx.srcAttr._2 + ctx.attr, ctx.srcAttr._3 :+ ctx.srcId))
},
(a,b) => if (a._1 < b._1) a else b
)
g2 = g2.outerJoinVertices(newDistances)((vid, vd, newSum) => {
val newSumVal = newSum.getOrElse((Double.MaxValue,List[VertexId]()))
(
vd._1 || vid == currentVertexId,
math.min(vd._2, newSumVal._1),
if (vd._2 < newSumVal._1) vd._3 else newSumVal._2
)
})
}
g.outerJoinVertices(g2.vertices)((vid, vd, dist) =>
(vd, dist.getOrElse((false,Double.MaxValue,List[VertexId]()))
.productIterator.toList.tail
))
}
// Path Finding - random node from which to find all paths
val v1 = 4000000028222916L
然后我用我的图和随机顶点id调用它们的函数 v1
未被确认为 long
类型和 L
我解决了这个问题。
val results = dijkstra(my_graph, 1L).vertices.map(_._2).collect
println(results)
但是,这将返回以下内容:
Error: Exception in thread "main" java.lang.NoSuchMethodError: scala.runtime.ObjectRef.create(Ljava/lang/Object;)Lscala/runtime/ObjectRef;
at GraphX$.dijkstra$1(GraphX.scala:51)
at GraphX$.main(GraphX.scala:85)
at GraphX.main(GraphX.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
第51行是指 var g2 = g.mapVertices(
第85行是指 val results = dijkstra(my_graph, 1L).vertices.map(_._2).collect
这个异常是指什么方法?我可以打包 sbt
如果没有错误,我就看不出我调用的是什么方法,而这个方法并不存在。
2条答案
按热度按时间cczfrluj1#
问题不是版本错误,也不是缺少实现,而是来自编译器的误导性错误。
好的,事情是这样的:在研究了代码之后,我注意到下面的部分包含了一个额外的右括号:
你只需要去掉多余的圆括号,它就会工作得很好。以下是完整代码:
现在,让我们测试一下:
nr7wwzry2#
误差分析:
请查看错误:
你的程序正在寻找
create()
方法,但没有得到这个。根本原因分析:
实际上,当scala和spark之间的版本不匹配时,就会发生这种类型的错误。
或者,
编译由一个版本完成,在运行时使用另一个scala版本。
scala版本差异:
如果您选择scala版本2.10.x
https://github.com/scala/scala/blob/2.10.x/src/library/scala/runtime/objectref.java
你会得到,
ObjectRef
班级有但如果你检查一下,scala版本2.11。xhttps://github.com/scala/scala/blob/2.11.x/src/library/scala/runtime/objectref.java
你会得到,
ObjectRef
班级有