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

Mik*_*nte 3 scala covariance apache-spark rdd

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

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)
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lec 5

这张"不会修复"的JIRA门票解释了这一切.


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

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