【问题标题】:Spark RDD subtract doesn't work?Spark RDD减法不起作用?
【发布时间】:2017-08-27 20:49:45
【问题描述】:

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

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

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

val R3 = R1.subtract(R2).

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

我是否需要广播较小的 RDD 才能使减法起作用?任何人都可以帮忙吗?谢谢

【问题讨论】:

  • RDD 持有什么类型的值?
  • 你可以在这里找到一些提示:stackoverflow.com/questions/37969286/comparing-two-rdds
  • 请发布示例数据,RDD 包含和使用的 Spark 版本。
  • RDD 包含一个对象类 MyModel。这是 MyModel 类: case class MyModel(id: Int, name: String, hour: Long)

标签: scala apache-spark rdd


【解决方案1】:
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 的案例类等于默认实现,您会期望它们相等,但它们不是。

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|
+---+----+----+

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 2015-09-05
    • 2021-01-01
    • 2016-12-05
    • 2017-05-03
    • 2018-09-14
    • 2016-11-27
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多