我有两个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中。
答案 0 :(得分:1)
新的RDD只包含rdd2的条目而不是rdd1
左连接将保留rdd1中的所有键,并追加RDD2匹配键值的列。所以很明显左连接/外连接不是解决方案。
rdd1Grouped.subtractByKey(rdd2Grouped)
适用于您的情况。
P.S。 :还要注意,如果rdd1更小更好播放它。这样,在减去时只会传输第二个rdd。
答案 1 :(得分:1)
切换rdd1Grouped
和rdd2Grouped
,然后使用filter
:
val output = rdd2Grouped.leftOuterJoin(rdd1Grouped).filter( line => {
line._2._2.isEmpty
}).collect