Как создать признак для общих операций RDD

#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 , и это решило ее.