对List的相应元素应用函数

时间:2014-05-02 23:19:18

标签: scala apache-spark

我有两个List,每个List包含一系列元组。我试着 针对List的相应元素运行函数。

  val l1 = List(("a" , Seq( ("link1", 2) , ("link2" , 4) )))
                                                  //> l1  : List[(String, Seq[(String, Int)])] = List((a,List((link1,2), (link2,3)
                                                  //| )))
  val l2 = List(("b" , Seq( ("link1", 2) , ("link3" , 3) , ("link2" , 3) )))
                                                  //> l2  : List[(String, Seq[(String, Int)])] = List((b,List((link1,2), (link3,3)
                                                  //| , (link2,3))))

所以我试图将两个列表分组为以下格式,然后对相应的元素应用函数:

  l1Grouped = Seq( ("link1", 2) , ("link2" , 4)
  l2Grouped = Seq( ("link1", 2) , ("link2" , 3)

一旦元素采用上述格式,我可以使用zip来应用该函数。

“link3”未包含在任何一个列表中,因为它只包含在l2

为了达到这个目的,我正在尝试使用以下交叉功能对项目进行分组:

 l1(0)._2.intersect(l2(0)._2)                    //> res0: Seq[(String, Int)] = List((link1,2), (link2,3))

但这会增加类似的项目一次。

如何运行vars l1&的相应元素? l2定义如上?

在实践中l1& 2是spark obj RDD类型,我在本例中使用List进行测试,但同一解决方案应与RDD兼容。

1 个答案:

答案 0 :(得分:3)

不需要intersectzip

val map = l1(0)._2.toMap
for {
  (k, v1) <- l2(0)._2
  v2 <- map.get(k)
} yield ... // Return a value based on v1 and v2

我们将列表1中的元素存储到地图中,然后在列表2上进行交互,只返回值,如果它们也存在于地图中。