2017-05-11 5 views
2

Ich habe dieses DataFrame df mit 3 Spalten: id, type und activity.So gruppieren Sie Daten nach Spalte und berechnen die Anzahl der Beobachtungen pro Gruppe

val myData = (Seq(("aa1", "GROUP_A", "10"),("aa1","GROUP_A", "12"),("aa2","GROUP_A", "hy"),("aa2", "GROUP_B", "14"), 
       ("aa3","GROUP_B", "11"),("aa3","GROUP_B","12"),("aa2", "GROUP_3", "12")) 

val df = sc.parallelize(myData).toDF() 

Ich muss Gruppendaten von type und dann die Anzahl der Aktivitäten für jeden id berechnen. Dies ist das erwartete Ergebnis:

type  id count 
GROUP_A aa1 2 
GROUP_A aa2 1 
GROUP_B aa3 3 
GROUP_B aa2 1 

Das ist, was ich versucht:

df.groupBy("type","id").count().sort("count").show() 

aber es kein korrektes Ergebnis.

Antwort

1

ich Ihre Beispieldaten minimal verändert und es funktioniert für mich:

//yours 
val myData = (Seq(("aa1", "GROUP_A", "10"),("aa1","GROUP_A", "12"),("aa2","GROUP_A", "hy"),("aa2", "GROUP_B", "14"),("aa3","GROUP_B", "11"),("aa3","GROUP_B","12"),("aa2", "GROUP_3", "12")) 

//mine 
//removed the (at the beginning 
//changed GROUP_3 to GROUP_B 
//other minor changes so that the resultant group by will look like you desired 
val myData = Seq(("aa1", "GROUP_A", "10"),("aa1","GROUP_A", "12"),("aa2","GROUP_A", "12"),("aa3", "GROUP_B", "14"),("aa3","GROUP_B", "11"),("aa3","GROUP_B","12"),("aa2", "GROUP_B", "12")) 


//yours 
val df = sc.parallelize(myData).toDF() 
//mine 
//added in column names 

val df = sc.parallelize(myData).toDF("id","type","count") 

df.groupBy("type","id").count.show 
+-------+---+-----+ 
| type| id|count| 
+-------+---+-----+ 
|GROUP_A|aa1| 2| 
|GROUP_A|aa2| 1| 
|GROUP_B|aa2| 1| 
|GROUP_B|aa3| 3| 
+-------+---+-----+ 

Gibt es etwas, ich verpasst?

+0

Vielen Dank. Es sollte 'toDF (" id "," type "," count ") sein, weil' aa..' 'id' ist. Lass mich nachschauen. – Dinosaurius

+0

meine Antwort bearbeitet, so ist es, wie es sein sollte –

0

Sie können die column names definieren, wenn Sie dataframe erstellen und die Zählung auf der grouped data durchführen. Dies sollte einfach sein

import sqlContext.implicits._ 

val myData = Seq(("aa1", "GROUP_A", "10"), 
    ("aa1","GROUP_A", "12"), 
    ("aa2","GROUP_A", "hy"), 
    ("aa2", "GROUP_B", "14"), 
    ("aa3","GROUP_B", "11"), 
    ("aa3","GROUP_B","12"), 
    ("aa3", "GROUP_B", "12")) 

val df = sc.parallelize(myData).toDF("id", "type", "activity") 
df.groupBy("type","id").count().sort("count").show() 
Verwandte Themen