【问题标题】:Why Spark RDD is invariant in T?为什么 Spark RDD 在 T 中是不变的?
【发布时间】:2016-12-10 23:42:37
【问题描述】:

我希望能够做这样的事情

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 中保持不变?

【问题讨论】:

  • 无法回答原因,但您可以回答Seq[Super](new Type1()),例如。不漂亮但有效。

标签: scala apache-spark rdd covariance


【解决方案1】:

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


因为 Stack Overflow 不喜欢仅仅链接到一个答案,这里是它的要点。

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

【讨论】:

  • 您认为这是否有可能用于 spark 2.0 数据集(而不是 RDD),或者它们是否会存在相同的兼容性问题?
  • @combinatorist 不。 Spark 2.2 出来了,数据集,就像 RDD 一样是不变的。我在回答中提到的相同限制仍然适用于数据集。
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 2016-11-29
  • 2015-04-15
  • 2015-09-08
  • 1970-01-01
相关资源
最近更新 更多