Ich habe folgendes Schema, das ich von csv lesen:De normalisierenden Daten in Funken scala
val PersonSchema = StructType(Array(StructField("PersonID",StringType,true), StructField("Name",StringType,true)))
val AddressSchema = StructType(Array(StructField("PersonID",StringType,true), StructField("StreetNumber",StringType,true), StructField("StreetName",StringType,true)))
Eine Person kann mehrere Adressen hat und durch PersonID verwendet.
Kann jemand helfen, die Datensätze in eine PersonAddress-Datensätze zu transformieren, wie in der folgenden Fallklassendefinition?
case class Address(StreetNumber:String, StreetName:String)
case class PersonAddress(PersonID:String, Name:String, Addresses:Array[Address])
Ich habe folgendes versucht, aber es Ausnahme im letzten Schritt geben:
val results = personData.join(addressData, Seq("PersonID"), "left_outer").groupBy("PersonID","Name").agg(collect_list(struct("StreetNumber","StreetName")) as "Addresses")
val personAddresses = results .map(data => PersonAddress(data.getAs("PersonID"),data.getAs("Name"),data.getAs("Addresses")))
personAddresses.show
Gibt einen Fehler:
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to $line26.$read$$iw$$iw$Address
Was ist der Typ von 'data.getAs (" Adressen ")'? Ist das nicht eine Liste von Strukturen? Sie sollten auch darüber "mappen", was ich für das Verständnis schön finde. –
Wie mache ich das? Wenn ich folgendes probierte, beklagt es sich, dass "Wertkarte ist kein Mitglied von Nichts" val personAddresses = Ergebnisse .map (Daten => PersonAddress (data.getAs ("PersonID"), data.getAs ("Name") , data.getAs ("Adressen"). map (df => Adresse (df.getAs ("StreetNumber"), df.getAs ("StreetName")))) – SYL
'data.getAs [Adressen] (" Adressen ") '? –