我是 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)
.No. 从 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 编写函数并实现上述挑战。
以下函数将识别符合您的条件的候选三元组。
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 中映射此函数以获得所需的输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句