Scala Spark RDD减法不';不行?

Scala Spark RDD减法不';不行?,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有两个RDD[MyModel]:R1和R2。以下是MyModel类: case class MyModel(id: Int, name: String, hour: Long) 如果R2中存在元素,我想从R1中删除元素。这就是我所尝试的: val R3 = R1.subtract(R2). 但是,R1与R3相同(我确信R1和R2之间存在共同元素) 我需要广播较小的RDD以使减法工作吗?有人能帮忙吗?谢谢 scala> val rdd1 = spark.sparkContext.par

我有两个
RDD[MyModel]
R1
R2
。以下是
MyModel
类:

case class MyModel(id: Int, name: String, hour: Long)
如果
R2
中存在元素,我想从
R1
中删除元素。这就是我所尝试的:

val R3 = R1.subtract(R2).
但是,
R1
R3
相同(我确信
R1
R2
之间存在共同元素)

我需要广播较小的RDD以使减法工作吗?有人能帮忙吗?谢谢

scala> val rdd1 = spark.sparkContext.parallelize(List(MyModel(1, "AAA", 1000), MyModel(2, "ABC", 2000)))
scala> val rdd2 = spark.sparkContext.parallelize(List(MyModel(1, "AAA", 1000), MyModel(3, "WWW", 5000)))

scala> val rdd1_id1 = rdd1.filter(_.id == 1).first
rdd1_id1: MyModel = MyModel(1,AAA,1000)

scala> val rdd2_id1 = rdd2.filter(_.id == 1).first
rdd2_id1: MyModel = MyModel(1,AAA,1000)
2看起来是相同的,根据Scala的case class equals默认实现,您希望它们相等,但事实并非如此

rdd1_id1.equals(rdd2_id1)
res13: Boolean = false
更多信息请参见本文和可能的解决方案:

另一方面,对于一个简单的修复,如果可能的话,我会使用数据集:

scala> rdd1.toDS.except(rdd2.toDS).show
+---+----+----+
| id|name|hour|
+---+----+----+
|  2| ABC|2000|
+---+----+----+

RDD
包含什么类型的值?您可以在这里找到一些提示:请发布RDD包含的示例数据和使用的Spark版本。RDD包含一个对象类MyModel。下面是MyModel类:case类MyModel(id:Int,name:String,hour:Long)