抽象クラスA
があるとします。クラスA
を継承したクラスB
とC
もあります。これらのクラスを考えるとSpark Scala:親タイプを受け入れる関数にサブタイプを渡す
abstract class A {
def x: Int
}
case class B(i: Int) extends A {
override def x = -i
}
case class C(i: Int) extends A {
override def x = i
}
、私は以下のRDDを構築:
def f(data: RDD[(Long, Set[A])]) = {
data.flatMap({
case (k, v) => v map { af =>
(af, 1)
}
}).reduceByKey(_ + _)
}
:
val data = sc.parallelize(Seq(
Set(B(1), B(2)),
Set(B(1), B(3)),
Set(B(1), B(5))
)).cache
.zipWithIndex
.map {case(k, v) => (v, k)}
私はまた、入力としてRDDを取得し、各要素の数を返し、次の機能を持っています
RDDは受理タイプA
です。私はf(data: RDD[(Long, Set[B])])
に関数のシグネチャを変更した場合
type mismatch;
found : org.apache.spark.rdd.RDD[(Long, scala.collection.immutable.Set[B])]
required: org.apache.spark.rdd.RDD[(Long, Set[A])]
val x = f(data)
このエラーは消える;:B
はA
のサブタイプであるが、私は以下のコンパイルエラーが出るようになりました、私は、予想通りval x = f(data)
がカウントを返すことを期待しますしかし、私はRDDで他のサブクラス(例えばC
のようなもの)を使用したいので、これを行うことはできません。私はまた、次のアプローチを試してみました
:
def f[T <: A](data: RDD[(Long, Set[T])]) = {
data.flatMap({
case (k, v) => v map { af =>
(af, 1)
}
}) reduceByKey(_ + _)
}
をしかし、これも私の次の実行時エラーを与える:
value reduceByKey is not a member of org.apache.spark.rdd.RDD[(T, Int)]
possible cause: maybe a semicolon is missing before `value reduceByKey'?
}) reduceByKey(_ + _)
私はこの上の任意の助けに感謝します。
BがAのサブタイプであるという理由だけで、[A]セット[B]は設定のサブタイプであることを意味するものではありません。これは、 'Set'が不変であるためです。あなたのセットがセット[A] – puhlen