从对列表中创建三元组列表,使得三元组的所有子集都出现在对列表中

时间:2017-02-25 19:17:03

标签: scala list function apache-spark

我是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)])]

我想从双打中计算一个新的三元组列表,但三元组列表应该包含我们正在计算的原始列表中存在的所有子集。因此,我们不能简单地展平配对列表,然后生成所有三元组。

在上面的示例中,我们将只有四个三元组中的以下三元组(如果我们变平,我们有(1,List(98,100,101,102)。从4中选择3的方法的数量是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编写函数并实现上述挑战。

1 个答案:

答案 0 :(得分: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中映射此函数以获得所需的输出。