值 < 不是 AnyVal 的成员

value < is not a member of AnyVal

我一直在用 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)
  })
}

可能是什么原因,我该如何纠正?

您需要将类型绑定到参数 kv1kv2 上。如果没有类型信息,编译器只能推断您使用的是匿名对象(AnyVal 类型),它没有定义比较运算符。

表达式

if (x._1 == 0) (x._1, 0) else (x._1, Long.MaxValue)

具有类型 (Long, AnyVal) 因为 0 是一个 Int 文字(在这种情况下它不会隐式转换为 Long)并且 [=14 的最小上限=] 并且 LongAnyVal。正确的代码应该是

if (x._1 == 0) (x._1, 0L) else (x._1, Long.MaxValue)
//                     ^ use Long literal there

第二个也是如此if

如果类型不匹配,将出现此错误。

我在处理元组列表时遇到了同样的问题

输入:

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 > is not a member of AnyVal

         L.map(x => (x._1,x._2.toUpperCase, if(x._3 > 10000) x._3+x._3*0.1 else x._3))
                                                     ^

我通过将元组 (4,azeez,89890) => (4,azeez,89890.0) 的 AnyVal 设为 Double 来解决它

// 修复后

输入:

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))