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



我想更改数据的格式,从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吗?还是返回到我的经典模型?

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

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

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

幸运的是,这在Scala/Spark中通常很容易修复——将类定义为case类。这会自动生成从类的所有属性派生的equalshashcodetoString方法。例如:

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

如果只想根据某些属性来比较对象,则必须定义自己的equalshashcode方法。例如,请参阅Scala编程。

最新更新