Ausgabe
Ich habe eine Klasse Dimensions (Int, Int, Int) und eine Form (String name), die in ein Tuple (Shape, Dimensions) eingefügt wurden.
Mein Datensatz ist:
(Cube, Dimensions(5,5,5))
(Sphere, Dimensions(5,10,15))
(Cube, Dimensions(3,3,3))
Das muss ich zurückgeben:
(Cube, Dimensions(8,8,8))
(Sphere, Dimensions(5,10,15))
wobei ich nach dem Namen der Form gruppiere und dann alle Dimensionswerte zusammenfasse. Derzeit kann ich in ein (Name, Int, Int, Int) abbilden, aber ich bin mir nicht sicher, wie ich es wieder in ein Dimensionsobjekt umwandeln soll.
data.map(_._2.map(x => (x.length,x.width,x.height)))
Jede Hilfe wäre willkommen
Lösung
Angenommen, es gibt keine sehr spezifischen Sonderfälle und Sie haben eine RDD. Sie brauchen nur eine aggregateByKey
.
case class Dimensions(i1: Int, i2: Int, i3: Int)
val initialRdd: RDD[(Shape, Dimensions)] = ???
def combineDimensions(dimensions1: Dimensions, dimensions2: Dimensions): Dimensions =
Dimensions(
dimensions1.i1 + dimensions2.i1,
dimensions1.i2 + dimensions2.i2,
dimensions1.i3 + dimensions2.i3
)
val finalRdd: RDD[(Shape, Dimensions)] =
initialRdd
.aggregateByKey(Dimensions(0, 0, 0))(
{ case (accDimensions, dimensions) =>
combineDimensions(accDimensions, dimensions)
},
{ case (partitionDimensions1, partitionDimensions2) =>
combineDimensions(partitionDimensions1, partitionDimensions1)
}
)
Beantwortet von – sarveshseri
Antwort geprüft von – Senaida (FixError Volunteer)