为什么 Spark RDD 在 T 中是不变的?
Why Spark RDD is invariant in T?
我希望能够做这样的事情
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[Super],但这甚至没有编译。 RDD 是否有任何理由在 T 中不变?
This "won't-fix" JIRA ticket explains it all.
因为 Stack Overflow 不喜欢只链接到一个答案,这里是它的要点。
- 尽管 RDD 向用户公开了一个不可变的接口,但内部状态存在很多可变性,这需要在各处散布向下转换。
- 与
Map
(密钥不变)和 Array
(不变)的交互会更加尴尬(而且几乎肯定不会向后兼容)
- 协方差意味着 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)
如果 RDD 在 T union 上是协变的,那么 RDD[Super] 就是 RDD[Super],但这甚至没有编译。 RDD 是否有任何理由在 T 中不变?
This "won't-fix" JIRA ticket explains it all.
因为 Stack Overflow 不喜欢只链接到一个答案,这里是它的要点。
- 尽管 RDD 向用户公开了一个不可变的接口,但内部状态存在很多可变性,这需要在各处散布向下转换。
- 与
Map
(密钥不变)和Array
(不变)的交互会更加尴尬(而且几乎肯定不会向后兼容) - 协方差意味着 Spark 直到运行时才知道实际进入 RDD 的是什么,这使得与其他库(即酸洗)的交互更加复杂。