我有一个对象A,其中包含一个对象列表B,我希望从每个B对象中获取一些东西(例如:B.id),或者每个组合都有2个。
示例代码:
rddA.flatMap(
a => a.listB.map(
b => (a.id, b.id)
)
)
答案 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