我一直在scala中编写代码来找到最短路径。这是我找到Shortest-Path的代码。但是我在代码的以下部分出现错误
if ( (kv1._1 + kv1._2 )< (kv2._1 + kv2._2)) kv1 else kv2
错误是
value < is not a member of AnyVal
这是我的代码:
val inputRDD = sc.textFile(args(0)).map { line =>
val a = line.split(",")
(a(0).toLong, (a(1).toLong, a(2).toLong))
}
var distanceRDD = inputRDD.flatMap(x => {
val pair1 = if (x._1 == 0) (x._1, 0) else (x._1, Long.MaxValue)
val pair2 = if (x._2._1 == 0) (x._2._1, 0) else (x._2._1, Long.MaxValue)
List(pair1, pair2)
}).distinct()
for ( index <- 1 to 4 ) {
val vertexDistanceRDD= inputRDD.join(distanceRDD)
val invertedRDD =vertexDistanceRDD.map(attr => (attr._2._1._2,(attr._2._1._1,attr._2._2)))
val computedDistBetweenVertRDD =invertedRDD.reduceByKey((kv1, kv2) => {
if (kv1._2 == kv2._2) if (kv1._1 < kv2._1) kv1 else kv2
else if (kv1._2.<(kv2._2)){
if ( kv2._2 != Long.MaxValue) {
if ( (kv1._1 + kv1._2 )< (kv2._1 + kv2._2)) kv1 else kv2
}
else kv1
}
else {
if ( kv1._2 != Long.MaxValue) {
if (kv1._1 + kv1._2 < kv2._1 + kv2._2) kv1 else kv2
}
else kv2
}
})
val joinedRDD = computedDistBetweenVertRDD.join(distanceRDD)
distanceRDD =joinedRDD.map(kv => {
if (kv._2._2 > kv._2._1._1 + kv._2._1._2) (kv._1,kv._2._1._1 + kv._2._1._2) else (kv._1,kv._2._2)
})
}
可能的原因是什么?如何纠正?
答案 0 :(得分:5)
表达
if (x._1 == 0) (x._1, 0) else (x._1, Long.MaxValue)
的类型为(Long, AnyVal)
,因为0
是Int
文字(在这种情况下,它不会隐式转换为Long
),Int
的最小上限Long
是AnyVal
。正确的代码应该是
if (x._1 == 0) (x._1, 0L) else (x._1, Long.MaxValue)
// ^ use Long literal there
同样适用于您的第二个if
答案 1 :(得分:0)
您需要在参数kv1
和kv2
上设置类型绑定。如果没有类型信息,编译器只能推断您使用的匿名对象(AnyVal
类型)没有定义比较运算符。
答案 2 :(得分:0)
如果类型不匹配,则会发生此错误。
在使用元组列表时遇到相同的问题
输入:
val L = List((1,"Raja",2000.0),(2,"Fahad",1000000.0),(3,"shoaib",40023.0),(4,"azeez",89890))
输出:
L: List[(Int, String, AnyVal)] = List((1,Raja,2000.0), (2,Fahad,1000000.0), (3,shoaib,40023.0), (4,azeez,89890))
输入:
L.map(x => (x._1,x._2.toUpperCase, if(x._3 > 10000) x._3+x._3*0.1 else x._3))
输出:
:28:错误:值>不是AnyVal的成员
L.map(x => (x._1,x._2.toUpperCase, if(x._3 > 10000) x._3+x._3*0.1 else x._3)) ^
我通过将AnyVal变为元组(4,azeez,89890)=>(4,azeez,89890.0)
来解决了这个问题//修复后
输入:
scala> val L = List((1,"Raja",2000.0),(2,"Fahad",1000000.0),(3,"shoaib",40023.0),(4,"azeez",89890.0))
输出:
L: List[(Int, String, Double)] = List((1,Raja,2000.0), (2,Fahad,1000000.0), (3,shoaib,40023.0), (4,azeez,89890.0))
输入:
scala> L.map(x => (x._1,x._2.toUpperCase, if(x._3 > 10000) x._3+x._3*0.1 else x._3))
输出:
res44: List[(Int, String, Double)] = List((1,RAJA,2000.0), (2,FAHAD,1100000.0), (3,SHOAIB,44025.3), (4,AZEEZ,98879.0))