我有两个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兼容。
答案 0 :(得分:3)
不需要intersect
或zip
:
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上进行交互,只返回值,如果它们也存在于地图中。