如何为通用RDD操作构建特征

时间:2019-03-19 23:27:58

标签: scala apache-spark generics

我正在尝试构建一个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][T : MyClass : ClassTag]无效,我找不到正确的语法。

谢谢!

1 个答案:

答案 0 :(得分:0)

所以我能够解决我的问题。

我没有意识到,但是问题仅来自mapValues

这是由于T不是ClassTag造成的。

为解决此问题,我在使用(implicit ct: ClassTag[T])的方法中添加了mapValues并解决了该问题。