Spark RDD减法不起作用?

时间:2017-04-03 05:20:14

标签: scala apache-spark rdd

我有两个RDD[MyModel]R1R2。这是MyModel类:

case class MyModel(id: Int, name: String, hour: Long)

如果R1中存在元素,我想从R2中删除元素。这就是我试过的:

val R3 = R1.subtract(R2).

但是,R1R3相同(我确信R1R2之间存在共同元素)

我是否需要广播较小的RDD以进行减法工作?有人可以帮忙吗?感谢

1 个答案:

答案 0 :(得分:2)

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类等于默认实现,你会期望它们是相等的,但它们不是。

rdd1_id1.equals(rdd2_id1)
res13: Boolean = false

此帖子中的更多信息以及可能的解决方案:http://jnordenberg.blogspot.ch/2009/04/equality-mutability-and-products.html

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

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