我在rdd
为RDD[(String,Vector)]
的代码中有以下代码段,但遗憾的是我的Scala编译器抱怨错误Type mismatch, expected: RDD[(String,Vector)], actual: RDD[(String,Vector)]
,我调用flagVectorOutlier(rdd, predictedRDD)
def someFunction() {
testData.foreachRDD( rdd => {
val vectorsRDD = rdd.map( pair => pair._2 )
val predictedRDD = model.latestModel().predict( vectorsRDD )
flagVectorOutlier( rdd, predictedRDD )
} )
ssc.start()
ssc.awaitTermination()
}
def flagVectorOutlier(testVectors: RDD[(String, Vector)], predicts: RDD[Int]): Unit = {
}
考虑到实际和预期的类型是相同的,这里有什么错误的观点?我怎么能解决这个问题?
答案 0 :(得分:1)
之前我遇到过这种错误。
它发生在我使用的是一个使用java.util.List
的java库时,而我自己的代码正在使用scala.collection.immutable.List
并将它们混合起来。
您可以轻松地在代码中共存两个具有相同名称的类,但错误消息将不会显示完全限定名称,因此我会得到Type mismatch, expected: List[Integer], actual: List[Integer]
这看起来令人费解。解决方案只是完全限定输入参数的类型,或使用typeDef来区分它们。
奖金:我也遇到了与元组类似的问题。例如,当一个方法可以期望元组或直接参数时:
def f(param: (Integer, String))
与def f(param1: Integer, param2: String)
当使用错误的参数调用方法时(例如,2个参数而不是元组),粗略检查时,错误消息似乎显示两个相同的类型。如果您有多个嵌套元组(因此括号太多但类型相同),情况会变得更糟。