我有两个RDD,比如A和B,类型为RDD[Array[Int]]
,想要计算集合差A-B和B-A。我尝试了以下代码
val R1 = A.subtract(B)
val R2 = B.subtract(A)
但它不会返回正确的答案。在前面的回答中,提到">通常不支持使用可变类型(本例中为Array(执行减法等设置操作,或者至少不建议执行。"因此,我必须将代码更改为
val A1 = A.map(_.to[ArrayBuffer]).persist()
val B1 = B.map(_.to[ArrayBuffer]).persist()
val R1 = A1.subtract(B1)
val R2 = B1.subtract(A1)
现在它返回正确答案。我想知道是否有更有效的方法。
链接的答案具有误导性。问题不在于可变性。解决该问题的CCD_ 2也是可变的。
subtract
内部比较使用equals
和equals
的元素。java数组的方法被破坏(它只是默认为引用相等(。
A1.map(_.toSeq).subtract(A2.map(_.toSeq))
将起作用。
.toSeq
将java数组封装到scala的WrappedArray
中,后者具有不那么令人惊讶的相等实现。