2017-01-13 5 views
0

Ich muss alle Spalten mit dem count.In Scala RDD erhalten.Scala RDD groupby zählen zusammen mit allen Spalten

Col1 col2 col3 col4 
us A  Q1 10 
us A  Q3 10 
us A  Q2 20 
us B  Q4 10 
us B  Q5 20 
uk A  Q1 10 
uk A  Q3 10 
uk A  Q2 20 
uk B  Q4 10 
uk B  Q5 20 

Ich möchte führen wie:

Col1 col2  col3  col4  count 
us   A   Q1  10   3 
us   A   Q3  10   3 
us   A   Q3  10   3 
us   B   Q4  10   2 
us   B   Q5  20   2 
uk   A   Q1  10   3 
uk   A   Q3  10   3 
uk   A   Q3  10   3 
uk   B   Q4  10   2 
uk   B   Q5  20   2 

Das von der col1 etwas wie Gruppe, col2 und bekommt zählt. Jetzt brauche ich zusammen mit col13, col4.

ich das SCALA RDD versuche mag:

val Top_RDD_1 = RDD.groupBy(f=> (f._1,f._2)).mapValues(_.toList) 

Dies erzeugt

RDD[((String, String), List[(String, String, String, Double, Double, Double)])] 

Lauter (col1, col2), List (col1, col2, col3, COL14) Ergebnis wie (uns, A) Liste ((uns, a, Q1,10), (uns, a, Q3,10), (uns, a, Q2,20)). ,,,

Wie kann ich die Liste nehmen zählen und auf den Listenwert zugreifen.

Bitte helfen Sie mir SCALA RDD-Code funken.

Danke Balaji.

Antwort

1

Ich sehe keinen Weg, dies in einem "Scan" der RDD zu tun - Sie müssen die Zählungen mit reduceByKey und dann join zu der ursprünglichen RDD berechnen. Um dies effizient zu tun (ohne dass erneute Berechnung des Eingangs) Sie sollten besser cache/persist die Eingabe vor dem anschließen:

val keyed: RDD[((String, String), (String, String, String, Int))] = input 
    .keyBy { case (c1, c2, _, _) => (c1, c2) } 
    .cache() 

val counts: RDD[((String, String), Int)] = keyed.mapValues(_ => 1).reduceByKey(_ + _) 

val result = keyed.join(counts).values.map { 
    case ((c1, c2, c3, c4), count) => (c1, c2, c3, c4, count) 
}