2016-07-21 17 views
1

Ich habe einen Dataframe df, der unter anderem eine Spalte von groupID hat; Das heißt, jede Beobachtung gehört zu einer bestimmten Gruppe. Insgesamt gibt es 8 Gruppen. Ich würde gerne aus jedem groupID ein bestimmtes Prozent der Beobachtungen (sagen wir 20%) abfragen. Hier ist mein Ansatz, dies zu tun:Für Schleife Spark Datenrahmen

val sample_df = for (i <- Array.range(0,7)) yield { 
      val sel_df = df.filter($"groupID"===i) 
      sel_df.sample(false,0.2,seed1) 
      } 

Das Ergebnis dieser Code ist:

Array[org.apache.spark.sql.DataFrame] = Array([text: string, groupID: int], [text: string, groupID: int]) 

I flatMap() auf sample_df angewendet, aber ich habe einen Fehler:

val flat_df = sample_df.flatMap(x => x) 
     <console>:59: error: type mismatch; 
     found: org.apache.spark.sql.DataFrame 
     required: scala.collection.GenTraversableOnce[?] 

Wie kann Ich bekomme einen gesampelten Datenrahmen?

Antwort

1

ich Sie wollen Probe auf jeder Gruppe gleichmäßig erraten.

sample_df.reduceLeft((result, df) => result.unionAll(df)) 
+0

Großartig! Das löst es! – aigujin

2

Soweit ich verstanden habe, versuchen Sie RDD von Row zu bekommen. Für die man einfach anrufen:

val rows: RDD[Row] = sample_df.rdd 

Um den Fehler zu erklären Sie besser, erfordert flatMap etwas verfahrbaren wie Option aber sie versorgt nur einen Row.

, auch alle Daten an den Treiber zu erhalten, können Sie anrufen:

val rows: Array[Row] = sample_df.collect 
+1

Hallo, danke für die Antwort . Leider ist 'sample_df' eine Array-Sammlung von Datenrahmen (' org.apache.spark.sql.DataFrame') und '.rdd'-Methode funktioniert nicht auf ihnen. Was ich brauche, ist diese Arraysammlung auf einen Datenrahmen zu reduzieren. Aus diesem Grund habe ich 'flatMap' angewendet. – aigujin

+0

Richtig, tut mir leid. Dann ist Rockie Yangs Antwort die richtige. –

0

Es scheint mir, Sie wollen nur eine 20% Probe des gesamten Datenrahmens nehmen? Wenn dies der Fall ist, gibt es keinen Grund, 8 verschiedene Datenrahmen zu erstellen und sie dann wieder zusammenzuführen.

df.sample(false, 0.2, seed)

den Trick. Wenn Sie für jede Gruppen-ID verschiedene Brüche durchführen wollen, dann sehen Sie sich df.stat.sampleBy an. Wenn Sie sicher sein wollen, dass es genau 20% jeder Klasse in der Probe dann werden Sie zu einer PairRDD konvertieren und geschichtete Stichprobe verwenden wie:

df.rdd.map(row => (row(groupIDIndex), row)).sampleByKeyExact(false, Map(0 -> 0.2, 1 -> 0.2, ..., 8 -> 0.2), seed)

Verwandte Themen