如何从另一个中减去 RDD[(Key,Object)]?

How do I subtract an RDD[(Key,Object)] from another one?

我想将我的数据格式从 RDD(Label:String,(ID:String,Data:Array[Double])) 更改为以标签、id 和数据作为组件的 RDD 对象。 但是当我连续两次打印我的 RDD 时,对象的引用发生了变化:

class Data_Object(private val id:String, private var vector:Vector) extends Serializable {
var label = ""
...
}

First print 
(1,ms3.Data_Object@35062c11)
(2,ms3.Data_Object@25789aa9)

Second print
(2,ms3.Data_Object@6bf5d886)
(1,ms3.Data_Object@a4eb65)

我认为这可以解释为什么 subtract 方法不起作用。那么我可以使用 subtract 对象作为值,还是 return 我的经典模型?

除非您另有说明,否则 Scala(和 Java)中的对象使用引用相等性(即它们的内存地址)进行比较。它们也根据这个地址打印出来,因此 Data_Object@6bf5d886 等等。

使用引用相等意味着两个 Data_Object 具有相同属性的实例不会被比较为相等,除非它们是完全相同的对象。此外,他们的引用将从一个 运行 变为下一个。

特别是在像 Spark 这样的分布式系统中,这不好——我们需要能够判断两个 不同 JVM 中的两个对象是否相同,根据他们的财产。在这个问题被修复之前,像 subtract 这样的 RDD 操作不会给出你期望的结果。

幸运的是,这通常很容易在 Scala/Spark 中解决 - 将您的 class 定义为 case class。这会自动生成从 class 的所有属性派生的 equalshashcode 以及 toString 方法。例如:

case class Data_Object(id:String, label:String, vector:Vector)

如果您只想根据 某些 属性来比较对象,则必须定义自己的 equalshashcode 方法, 尽管。例如,参见 Programming in Scala