比较两个RDD

时间:2016-06-22 13:18:33

标签: scala apache-spark compare rdd

我有两个RDD [Array [String]],让我们称它们为rdd1和rdd2。 我将创建一个新的RDD,其中只包含rdd2中不包含在rdd1中的条目(基于键)。 我通过Intellij在Scala上使用Spark。

我用一把钥匙对rdd1和rdd2进行了分组(我只比较两个rdds的键):

val rdd1Grouped = rdd1.groupBy(line => line(0))
val rdd2Grouped = rdd2.groupBy(line => line(0))

然后,我使用了leftOuterJoin

val output = rdd1Grouped.leftOuterJoin(rdd2Grouped).collect {
  case (k, (v, None)) => (k, v)
}

但这似乎没有给出正确的结果。

它出了什么问题?有什么建议?

RDDS示例(每一行都是一个数组[String],ofc):

rdd1                        rdd2                  output (in some form)

1,18/6/2016               2,9/6/2016                  2,9/6/2016
1,18/6/2016               2,9/6/2016 
1,18/6/2016               2,9/6/2016
1,18/6/2016               2,9/6/2016
1,18/6/2016               1,20/6/2016
3,18/6/2016               1,20/6/2016 
3,18/6/2016               1,20/6/2016
3,18/6/2016
3,18/6/2016
3,18/6/2016

在这种情况下,我想添加条目“2,9 / 6/2016”,因为键“2”不在rdd1中。

2 个答案:

答案 0 :(得分:1)

  

新的RDD只包含rdd2的条目而不是rdd1

左连接将保留rdd1中的所有键,并追加RDD2匹配键值的列。所以很明显左连接/外连接不是解决方案。

rdd1Grouped.subtractByKey(rdd2Grouped)适用于您的情况。

P.S。 :还要注意,如果rdd1更小更好播放它。这样,在减去时只会传输第二个rdd。

答案 1 :(得分:1)

切换rdd1Groupedrdd2Grouped,然后使用filter

val output = rdd2Grouped.leftOuterJoin(rdd1Grouped).filter( line => {
  line._2._2.isEmpty
}).collect