我一直在用scala编写代码,以找到最短的路径。这是我寻找最短路径的代码。但是我在下面的代码中发现了一个错误
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)
})
}可能的原因是什么,我如何纠正呢?
发布于 2017-11-10 06:28:35
表达式
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也是如此
发布于 2017-11-09 22:34:17
您需要在参数kv1和kv2上设置类型绑定。没有类型信息,编译器只能推断您使用的是匿名对象(AnyVal类型),而匿名对象上没有定义比较运算符。
发布于 2019-12-30 11:17:50
如果存在类型不匹配,则会发生此错误。
我在处理元组列表时遇到了同样的问题。
投入:
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: error: value >不是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)双倍来解决这个问题。
// FIX之后
输入:
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))https://stackoverflow.com/questions/47212617
复制相似问题