我对join
上的cogroup
或RDD
方法有疑问。详细地说,我必须加入两个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
使用通用通配符类型?
感谢您的所有回复。
答案 0 :(得分:0)
本文Towards Equal Rights for Higher-kinded Types
中说明了这个问题泛型是当代OO语言的一个非常受欢迎的特性, 例如Java,C#或Scala。然而,他们缺乏对通用性的支持。该 问题是他们只支持抽象适当的类型,而不是结束 通用类型。该限制使得例如不可能定义精确的界面 for Iterable,Scala集合API中的核心抽象。我们实施了 Scala 2.5中的“类型构造函数多态”,它解决了这个问题 在根目录,从而大大减少了签名和代码类型的重复。