【问题标题】:Apache Spark join/cogroup on generic type RDD泛型 RDD 上的 Apache Spark join/cogroup
【发布时间】:2016-04-26 16:11:18
【问题描述】:

我对@9​​87654323@ 上的joincogroup 方法有疑问。具体来说,我必须加入两个RDDs,其中一个是泛型​​类型的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)

这里发生了什么?为什么我不能cogroupRDDs 使用泛型通配符类型?

感谢您的所有回复。

【问题讨论】:

    标签: scala generics apache-spark rdd


    【解决方案1】:

    问题在本文Towards Equal Rights for Higher-kinded Types中陈述

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

    【讨论】:

    • 对不起,我不完全同意你的看法。 Scala 支持协变聚合。实际上,列表类型被声明为类List[+A]。参数类型+A 代表协方差。问题可能是RDD 类型,它也必须在 Java 代码中使用(它不支持协变和逆变),相对于它的类型变量被定义为 invariant。跨度>
    • 看到了。但我不明白你想到达哪里。我的意思是:您能否将问题中报告的案例的答案置于上下文中?
    • 不自​​称是这方面的专家,但根据我的理解,用非技术术语表达,当Iterable(可能以某种形式不可变)构建在@987654326 @ 您需要为您的 Tuple2 中的值元素提供构造函数,并且在您的情况下使用 Measure[_] 时无法推断出此构造函数。有更好的 Scala 和编译器背景的人可能会更好地解释它。
    • 拍得好!试着用这种方式修改你的回复,我会接受的。
    猜你喜欢
    • 2017-10-13
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2014-05-13
    • 1970-01-01
    • 2017-12-14
    • 2017-03-07
    相关资源
    最近更新 更多