Apache Spark join/cogroup on generic type RDD



我对RDD上的joincogroup方法有问题。详细地说,我必须连接两个RDD,其中一个是泛型类型的RDD,与通配符一起使用。

val indexedMeasures = measures.map(m => (m.id(), m)) // RDD[(String, Measure[_]]
val indexedRegistry = registry.map(r => (r.id, r))   // RDD[(String, Registry)]
indexedRegistry.cogroup(indexedMeasures)

最后一条语句给出编译时错误,如下所示:

no type parameters for method cogroup: (other: org.apache.spark.rdd.RDD[(String, W)])org.apache.spark.rdd.RDD[(String, (Iterable[Registry], 
 Iterable[W]))] exist so that it can be applied to arguments (org.apache.spark.rdd.RDD[(String, Measure[?0]) forSome { type ?0 }]) --- because --- argument expression's type is not compatible 
 with formal parameter type; found : org.apache.spark.rdd.RDD[(String, Measure[?0]) forSome { type ?0 }] required: org.apache.spark.rdd.RDD[(String, ?W)] Note: (String, 
 Measure[?0]) forSome { type ?0 } >: (String, ?W), but class RDD is invariant in type T. You may wish to define T as -T instead. (SLS 4.5)

这是怎么回事?为什么我不能cogroup RDD使用泛型通配符类型?

感谢您的所有回复。

这个问题在

这篇文章中陈述 迈向高等类型的平等权利

泛型是当代OO语言的一个非常流行的特征, 例如Java,C#或Scala。然而,他们缺乏对通用性的支持。这 问题是它们只支持对正确类型的抽象,而不是过度 泛型类型。这种限制使得无法定义精确的接口。 for Iterable,这是 Scala 集合 API 中的核心抽象。我们实施了 Scala 2.5 中的"类型构造函数多态性",解决了这个问题 在根目录下,从而大大减少了类型签名和代码的重复。

相关内容

最新更新