为什么Spark RDD在T中是不变的?

时间:2016-12-10 23:42:38

标签: scala apache-spark rdd covariance

我希望能够做到这样的事情

abstract class Super()
class Type1() extends Super
class Type2() extends Super

val rdd1 = sc.parallelize(Seq(new Type1()))
val rdd2= sc.parallelize(Seq(new Type2()))
val union = rdd1.union(rdd2)

如果RDD在T union上是协变的,那就是RDD [Super],但这甚至都没有编译。有没有理由让RDD在T中不变?

1 个答案:

答案 0 :(得分:5)

This "won't-fix" JIRA ticket explains it all

因为Stack Overflow不喜欢链接到答案,所以这是它的要点。

  • 虽然RDD向用户公开了一个不可变的接口,但是内部状态存在很多可变性,这需要在整个地方进行向下转换。
  • Map(密钥中的不变量)和Array(不变量)的交互将更加尴尬(并且几乎肯定不会向后兼容)
  • 协方差意味着Spark直到运行时才知道实际进入RDD的内容,这使得与其他库(即酸洗)的交互更加复杂。