泛型类型RDD上的Apache Spark join / cogroup

时间:2016-01-20 17:18:24

标签: scala generics apache-spark rdd

我对join上的cogroupRDD方法有疑问。详细地说,我必须加入两个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使用通用通配符类型?

感谢您的所有回复。

1 个答案:

答案 0 :(得分:0)

本文Towards Equal Rights for Higher-kinded Types

中说明了这个问题
  

泛型是当代OO语言的一个非常受欢迎的特性,   例如Java,C#或Scala。然而,他们缺乏对通用性的支持。该   问题是他们只支持抽象适当的类型,而不是结束   通用类型。该限制使得例如不可能定义精确的界面   for Iterable,Scala集合API中的核心抽象。我们实施了   Scala 2.5中的“类型构造函数多态”,它解决了这个问题   在根目录,从而大大减少了签名和代码类型的重复。