2017-02-25 59 views
1

我是新来的scala/spark,并且在编写spark程序时不确定是否有函数式编程。从成对列表中创建一个三元组列表,其中三元组的所有子集都存在于成对列表中

,我有以下格式的RDD:

//user_freq_pair : (1,List((98,101), (98,100), (98,102), (100,101), (101,102))) 
scala> user_freq_pair 
res17: org.apache.spark.rdd.RDD[(Int, List[(Int, Int)])] 

我想计算从双打,但三元名单三元组的一个新的列表应该有它的所有存在于原始列表的子集,从中我们正在计算。所以我们不能简单地将这个对列表弄平,然后生成所有的三元组。

在上面我们只有从四个可能的三倍以下三重的例子(办法从4选3如果我们拉平我们(1,List(98,100,101,102)。没有为4种方式):

//user_triple: (1,List((98,100,101)) because (98,101),(98,100),(100,101) all three are present in the original list 
scala> user_triple 
res18: org.apache.spark.rdd.RDD[(Int, List[(Int, Int,Int)])] 

我不确定如何为RDD编写函数并实现上述挑战。

+0

不是列表(98,101,102)也是一个有效的Triplet? –

+0

是的,谢谢指出 –

+0

而不是'List [List [Int]]'如何生成List [(Int,Int,Int)]' –

回答

1

以下函数将标识符合条件的候选三元组。

def generateTriplets(input: List[(Int,Int)]) = { 
    val combinations = input.flatMap({case (x,y) => List(x,y)}).toSet.toList.combinations(3).toList 
    combinations collect { 
      case a::b::c::Nil if 
       (input.contains((a,b)) || input.contains((b,a))) && 
       (input.contains((b,c)) || input.contains((c,b))) && 
       (input.contains((a,c)) || input.contains((c,a))) => (a,b,c) 

    } 
} 

样品输入

scala> generateTriplets(List((98,101), (98,100), (98,102), (100,101), (101,102))) 
res37: List[List[Int]] = List(List(98, 101, 100), List(98, 101, 102)) 

,那么你可以在映射在你的RDD这个函数来获得所需的输出。

+0

嗨,如果我们必须做同样的过程,但为三重对的新列表,然后找到一个“组合(4)”,然后再次列出4对,然后找到“组合(5)”我必须一次又一次地定义函数。有没有更好的实现方式,以便我只通过号码列表[(号码对)]并找到号码+ 1的组合 –

相关问题