0

Java で customRDD を作成しようとしています。

RDDは、 で定義されているScala 暗黙関数を使用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)
  }
}

CustomRDD.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() 

実行時に;に変換dataされます。PairRDDFunctionsつまり、 RDD.scalarddToPairRDDFunctionsで定義されたへの暗黙的な呼び出しを行います。

ただし、 CustomRDD.scalarddToCustomJavaRDDFunctionsで定義されたを呼び出して、 に変換する必要があります。PairCustomJavaRDDFunctions

4

1 に答える 1

1

ただし、 CustomRDD.scalarddToCustomJavaRDDFunctionsで定義されたを呼び出し、それを次のように変換する必要があります。PairCustomJavaRDDFunctions

いいえ、Scala はこのようには機能しません。オブジェクトの実行時の型に応じて暗黙的な変換をオーバーライドすることは、(ライブラリの部分とあなたの部分の両方に既存の機械がなければ) 単に不可能です。

暗黙は厳密にコンパイル時の機能です。RDDをあたかも であるかのように使用していることをコンパイラが認識すると、あたかも自分で書いたかPairRDDFunctionsのように の呼び出しに接続します。RDD.rddToPairRDDFunctions次に、コードがバイトコードに変換されると、その呼び出しはすでに組み込まれており、何も変更できません。これには動的ディスパッチはなく、すべて静的です。rddToCustomJavaRDDFunctionsが呼び出される唯一の状況は、問題の式の静的CustomJavaRDD型が既に である場合です。

本当に、これは必要ないはずです。暗黙的な変換は、実際には、キーストロークを節約するヘルパー メソッドの美化にすぎません。(暗黙のパラメーター、今は興味深いものです。;)) ヘルパー メソッドは既にポリモーフィックでありRDD、 、CustomRDD、または`RDD that travels through time to compute things faster`.

もちろん、それを行うことはできますが、実際には上記の条件下でしか何もできず、おそらくそうではない可能性が高く、全体がかなり無意味になります.

于 2016-12-17T23:52:04.110 に答える