#scala #apache-spark #generics
#scala #apache-spark #универсальные
Вопрос:
Я пытаюсь создать, trait
который реализовал бы универсальный вспомогательный метод для того типа, RDD
который у меня есть.
Например:
abstract class MyClass(name: String) {
final def getName: String = name
}
trait MyTrait[T <: MyClass] {
def myMethod(
input: RDD[T],
something: String
): RDD[T] = {
input.filter(_.getName != something)
}
def otherExample(
inputA: RDD[(T, String)],
inputB: RDD[(T, Int)]
): RDD[(T, (String, Int)] = {
inputA
.keyBy(_._1.getName)
.join(inputB....)
...
}
}
Но я получаю странные ошибки, такие как
value mapValues is not a member of org.apache.spark.rdd.RDD[(T, String)]
[error] possible cause: maybe a semicolon is missing before `value mapValues'?
Я попытался добавить ClassTag
в универсальный класс T
, но не смог найти правильный синтаксис, так как [T <: MyClass : ClassTag]
or [T : MyClass : ClassTag]
не работал.
Спасибо!
Комментарии:
1. В качестве дополнительного примечания: вместо определения методов, подобных
getName
, вы можете просто отметитьname: String
сval
помощью.2. о! Я понятия не имел, что
val
делал именно это! Спасибо!
Ответ №1:
Итак, я смог решить свою проблему.
Я не понимал, но проблема исходила только от mapValues
.
Это было вызвано тем фактом, что T
не было ClassTag
.
Чтобы решить проблему, я добавил (implicit ct: ClassTag[T])
к методу, который я использовал mapValues
, и это решило ее.