当对中的顺序无关紧要时,在RDD中获取对的唯一值

时间:2017-03-25 21:24:04

标签: scala apache-spark rdd

我有一个带有

值的rdd
a,b
a,c
a,d
b,a
c,d
d,c
d,e

我需要的是一个包含倒数对的rdd,但只有一组。它必须是:

a,b  or b,a
c,d  or d,c

我当时认为可以将它们添加到列表中并循环查找相反的对,如果存在过滤第一个值,则删除互惠对。我在想必须有一种使用scala函数的方法,比如join或case,但我很难理解它们

1 个答案:

答案 0 :(得分:3)

如果你不介意改变每一对的顺序(例如,(a,b)变为(b,a)),你可以给出一个简单易用的并行化解决方案。以下示例使用数字,但对可以是任何东西;只要价值具有可比性。

在香草斯卡拉:

List(
 (2, 1), 
 (3, 2), 
 (1, 2), 
 (2, 4), 
 (4, 2)).map{ case(a,b) => if (a>b) (a,b) else (b,a) }.toSet

这将导致:

res1: Set[(Int, Int)] = Set((2, 1), (3, 2), (4, 2))

在Spark RDD中,上述内容可表示为:

sc.parallelize((2, 1)::(3, 2)::(2, 1)::(4, 2)::(4, 2)::Nil).map{ case(a,b) => 
   if (a>b) (a,b) else (b,a) }.distinct()