2017-12-16 2 views
1

Ich habe einige Probleme mit groupByKey in Scala und Spark. Ich habe 2 Fallklassen:Wert mit groupByKey hinzufügen

case class Employee(id_employee: Long, name_emp: String, salary: String) 

Im Moment ich diese zweite Fall-Klasse verwenden:

case class Company(id_company: Long, employee:Seq[Employee]) 

Allerdings mag ich es mit diesem neuen ersetzen:

case class Company(id_company: Long, name_comp: String employee:Seq[Employee]) 

Es gibt ein übergeordnetes DataSet (df1), das ich mit groupByKey verwende, um Company Objekte zu erstellen:

val companies = df1.groupByKey(v => v.id_company) 
.mapGroups(
    { 
    case(k,iter) => Company(k, iter.map(x => Employee(x.id_employee, x.name_emp, x.salary)).toSeq) 
    } 
).collect() 

Dieser Code funktioniert, es gibt Objekte wie dieses:

Company(1234,List(Employee(0987, John, 30000),Employee(4567, Bob, 50000))) 

Aber ich finde nicht die Spitze der Gesellschaft name_comp auf diese Objekte hinzuzufügen (dieses Feld existiert df1). Um Objekte wie folgt aus (mit dem neuen Fall-Klasse) abzurufen:

Company(1234, NYTimes, List(Employee(0987, John, 30000),Employee(4567, Bob, 50000))) 
+0

nicht für's Sie als ein Feld/Attribut in jedem Ihrer Fallklassen name_comp' – Tanjin

+0

@Tanjin ich meinen Beitrag aktualisieren :) Für den Moment, als ich muss diese Fallklasse verwenden, aber ich möchte diese One ersetzen durch: Fallklasse Firma (id_company: Long, namp_comp: String Mitarbeiter: Seq [Mitarbeiter]) –

+1

Können Sie angeben, was der Typ für 'df1' ist? Es scheint, als sollte es 'Dataset [Company]' sein, aber das bedeutet, dass der Code nicht einmal kompiliert werden sollte ... Eine Klarstellung würde helfen. – Tanjin

Antwort

2

Da Sie sowohl das Unternehmen ID und den Namen, was Sie tun können, ist ein Tupel als Schlüssel zu verwenden, wenn Sie Gruppe Ihre Daten. Dies wird beiden Werte leicht zugänglich machen, wenn die Company Klasse Konstruktion:

df1.groupByKey(v => (v.id_company, v.name_comp)) 
    .mapGroups{ case((id, name), iter) => 
    Company(id, name, iter.map(x => Employee(x.id_employee, x.name_emp, x.salary)).toSeq)} 
    .collect() 
+0

Vielen Dank! Es funktioniert perfekt! Du hast meine WeekEnd gespeichert: D –

+0

@PierreJones: Keine Probleme, glücklich, dass es für dich geklappt hat. :) – Shaido

Verwandte Themen