RDD
s有一个方法distinct()
,它应该作为List
上的等效工作。然而,我不知道它的表演。
编辑
然而,这并不会因为在斯卡拉(a, b) != (b, a)
工作。所以你必须交换一些你的元素,以确保你没有得到任何双打。
如果您对您的类型有一些订购,您可以将所有配对映射到它们的订购等价物。例如,地图(2, 1)
至(1, 2)
和(3, 4)
至(3, 4)
。然后你可以使用distinct
,这将删除所有重复。
val distinctPairsRDD: RDD[(T, T)] = rdd.map{
case (a, b) if a <= b => (a, b)
case (a, b) => (b, a)
}.distinct()
如果你没有这样的排序,你可以通过一些Set
s,这是无序代替你对。所以,你可以按照如下映射您RDD
:
val distinctRDD: RDD[Set[T]] = rdd.map {
case (a, b) => Set(a, b)
}.distinct()
然而,这将失去你有型,所以你可能需要回去后对。要做到这一点,请记住Set
本身没有重复项,所以如果您有一个具有相同元素两次的对,它将被映射到只有一个元素的集合。
所以你必须做到以下几点:
val distinctPairs: RDD[(T, T)] = distinctRdd.collect {
case Set(a) => (a, a)
case Set(a, b) => (a, b)
}
的collect
可以由map
所取代,但它可能会诱发一些MatchError如果你以后更改您的代码。这会使所有其他情况(如果您恰好有一个空集或具有多于两个元素的集)被丢弃,因此请确保您对未来更改(而非RuntimeError或丢弃的元素)更喜欢什么。
TL; DR
尝试订购的元素在你的对,拿到唯一性。如果这不起作用,使用Set
s,但它会更复杂。
如何获得'(p1,c1)'作为此连接的结果?客户和产品是否属于同一类型?通常情况下,如果连接不在初始集合中,那么重复就不会出现在连接中。 –
@CyrilleCorpet是的,我刚刚更新了这个例子。谢谢! –