[FIXED] Wie summiere ich mehrere Felder einer Klasse?

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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like