0

我正在尝试用 Java 创建一个 customRDD。

RDD转换RDD[(K,V)]PairRDDFunctions[K,V]使用rddToPairRDDFunctions().object RDD

我正在尝试对我的CustomJavaRDDwhich extends CustomRDDwhich extends做同样的事情RDD

现在它应该rddToCustomJavaRDDFunctions()在遇到时调用隐式函数CustomJavaRDD[(K,V)],但由于某种原因它仍然会去rddToPairRDDFunctions()

我究竟做错了什么?

RDD.scala

class RDD[T]
object RDD {
  implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)])
      (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null):
      PairRDDFunctions[K, V] = {
    new PairRDDFunctions(rdd)
  }
}

自定义RDD.scala

abstract class CustomRDD[T] extends RDD[T]
object CustomRDD {
  implicit def rddToCustomJavaRDDFunctions[K,V](rdd: CustomJavaRDD[(K,V)]): 
      PairCustomJavaRDDFunction[K,V] = {
    new PairCustomJavaRDDFunctions[K,V](rdd)
  }
}

PairCustomJavaRDDFunctions.scala

class PairCustomJavaRDDFunctions[K: ClassTag, V: ClassTag](self: CustomRDD[(K, V)])
                        (implicit ord: Ordering[K] = null) {
  def collectAsMap() = ???
}

没有错误;程序编译成功,但假设我有data: RDD一个CustomJavaRDD.

data.collectAsMap() 

在运行时它转换dataPairRDDFunctions; 即它对RDD.scalarddToPairRDDFunctions中定义的隐式调用。

但它应该调用CustomRDD.scalarddToCustomJavaRDDFunctions中定义的并将其转换为.PairCustomJavaRDDFunctions

4

1 回答 1

1

但它应该调用CustomRDD.scalarddToCustomJavaRDDFunctions中定义的并将其转换为PairCustomJavaRDDFunctions

不,Scala 根本无法以这种方式工作。您想要的,根据对象的运行时类型覆盖隐式转换,根本不可能(在库和您的部分没有预先存在的机器)。

隐式是一个严格的编译时特性。当编译器看到你像使用 aRDD一样使用 an 时PairRDDFunctions,它会拼接到对 的调用RDD.rddToPairRDDFunctions,就好像你自己写的一样。然后,当代码被翻译成字节码时,这个调用已经被烘焙了,没有任何东西可以改变它。没有动态调度,它都是静态的。唯一rddToCustomJavaRDDFunctions会被调用的情况是当所讨论的表达式的静态类型已经是CustomJavaRDD.

真的,这不应该是必要的。隐式转换实际上只不过是可以节省击键的美化辅助方法。(隐式参数,现在这些很有趣。;)) 不需要重写它们,因为辅助方法应该已经是多态的并且无论你有RDD,CustomRDD还是. 都可以工作`RDD that travels through time to compute things faster`

当然,你仍然可以这样做,但它只会在上述条件下真正做任何事情,而且这可能不太可能,让整个事情变得毫无意义。

于 2016-12-17T23:52:04.110 回答