2015-03-10 8 views
1

У меня есть ниже фрагмент кода из кода, где rdd является RDD[(String,Vector)], но, к сожалению, мой Scala компилятор жалуется с ошибкой Type mismatch, expected: RDD[(String,Vector)], actual: RDD[(String,Vector)] где я называю flagVectorOutlier(rdd, predictedRDD)Идентичные несоответствие типов в Scala

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

Как выглядит ваш импорт? –

+0

@ LionelPort Я использую эти импорты: 'import org.apache.spark.SparkConf' ' import org.apache.spark.rdd.RDD' 'import org.apache.spark.streaming._' ' import org .apache.spark.streaming.StreamingContext' 'import org.apache.spark.mllib.linalg.Vectors' ' import org.apache.spark.mllib.clustering.StreamingKMeans' –

+0

Что произойдет, если вы добавите этот тип спецификатора в foreachRDD (rdd: RDD [(String, Vector)] ...? Являются ли эти классы Java String и Vector? – n0741337

ответ

1

У меня такая ошибка раньше. Это случилось, когда я использовал библиотеку java, которая использовала бы java.util.List, в то время как мой собственный код использовал scala.collection.immutable.List, и я их перепутал.

У вас может быть два класса с одинаковым именем, которые легко сосуществуют в коде, но сообщение об ошибке не отображает полностью квалифицированные имена, поэтому я бы получил Type mismatch, expected: List[Integer], actual: List[Integer], который кажется озадачивающим. Решение состоит в том, чтобы полностью квалифицировать типы ваших входных параметров или использовать typeDefs, чтобы отличить их.


Бонус: У меня также была аналогичная проблема с кортежами. Например, когда метод может либо ожидать кортежи или прямой Params:

def f(param: (Integer, String)) в сравнении def f(param1: Integer, param2: String)

При вызове метода с неправильными параметрами (скажем, 2 Params вместо кортежа), на беглом осмотре погрешности сообщение может показаться двумя идентичными типами. Это ухудшается, если у вас есть несколько вложенных кортежей (при этом слишком много скобок, но одинаковых типов).

+0

Спасибо! В моем случае это было фактически потому, что я работал по курсу «Принципы функционального программирования в Scala» Мартина Одерского ([link] (https://class.coursera.org/progfun-004)) и класса «Список» определенная в предыдущих лекциях, была перезаписана встроенная функция 'scala.collection.immutable.List'. Еще раз спасибо! – scubbo

Смежные вопросы