迭代RDD [A]其中A包含List [B]

时间:2018-05-30 17:43:22

标签: scala apache-spark rdd map-function

我有一个对象A,其中包含一个对象列表B,我希望从每个B对象中获取一些东西(例如:B.id),或者每个组合都有2个。

示例代码:

rddA.flatMap(
  a => a.listB.map(
    b => (a.id, b.id)
  )
)

1 个答案:

答案 0 :(得分:0)

这实际上有效,我的问题是我调用了一个使用另一个地图失败的方法。

case class Car( id :Long, listWheels : List[Wheel])

case class Wheel( id : Long)

rddCars.flatMap(
    a => a.listWheels.map(
     b => (a.id, b.id, getBrandFromSerial(serialToBrandMap,b.id))
    )
 )

getBrandFromSerial(serialToBrandMap: RDD[(Int, String)], id : Int) : String = {
   val a = serialToBrandMap.filter(_._1 == id)
   val b = a.map(_._2).top(1)
   b(0)
}

预期的结果是RDD [(Int,Int,String)],在Tuple3上有Car id,Wheel id和Wheel Brand。

编辑:输入/输出样本

输入:

val wheels1 = List(Wheel(1),Wheel(1),Wheel(2), Wheel(2)
val wheels2 = List(Wheel(3),Wheel(3),Wheel(2), Wheel(2)
val rddCars : RDD[Car] = sparkContect.parallelize(List(Car(1,wheels1), Car(2, wheels2)))

val serialToBrandList : List[(Int, String)] = List((1,"Brand1"), (2,"Brand2"),(3,"Brand3"))
val serialToBrandMap : RDD[(Int, String)] = sparkContect.parallelize( serialToBrandList)

输出:

 (1,1,Brand1),(1,1,Brand1),(1,2,Brand2)....(2,3,Brand3) and so on