2014-06-23 6 views
6

Ich bin ein Neuling in Spark/Scala. Das ist, was ich tue das erste Quartil einer CSV-Dateiersten Quartil für eine numerische Spalte in Spark berechnen

val column= sc.textFile("test.txt").map(_.split(",")(2)).flatMap(_.split(",")).map((_.toDouble)) 
val total = column.count.toDouble 
val upper=(total+1)/4 
val upper2= scala.math.ceil(upper).toInt 

Ich bin nicht wirklich sicher zu berechnen, wie die Spalte zu sortieren andere als ein Schlüsselwertpaar hinzuzufügen. alles, was ich brauche, ist die letzten 2 Werte für die Quartile zu nehmen, nachdem sie sortiert sind. Aber ich bin gezwungen, ein Schlüsselwertpaar zu erstellen.

val quartiles = column.map((_,1)).sortByKey(true).take(upper2) 
val first_quartile =0 
if(upper % upper.toInt >0){ 
    first_quartile = quartiles(upper.toInt-1) 
}else{ 
    first_quartile = (quartiles(upper2-1) +(quartiles(upper2-2))/2 
} 

Das funktioniert, aber es wird mich mit einem lästigen Schlüsselwertpaar verlassen. Wie kann ich zurück zu nur 1 Spalte anstelle von 2 (z. B. das Schlüssel-Wert-Paar)

+0

Sie können die Dummy-Werte über 'rdd.keys' verwerfen. –

+0

Gibt es einen Grund/eine Anforderung, Spark zu verwenden? – maasg

+0

nicht wirklich eine Anforderung, gerade erst zu lernen, Funken und Scala. es ist böse schnell. : D – user2773013

Antwort

6

War gerade dies selbst tun. Ich begann mit dem Schreiben einer Funktion, um den Median zu berechnen, fand aber, dass es schneller und einfacher war, Quantile zu bekommen, indem ich meine RDD als einen DataFrame umwandelte und ihn mit SQL abfragte. Hier ist ein in sich geschlossenes Beispiel:

// construct example RDD 
    val rows = Seq(3, 1, 5, 1, 9, 2, 2) 
    val rdd = sc.parallelize(rows) 

    // construct Dataframe 
    case class MedianDF(value: Long) 
    val df = rdd.map(row => MedianDF(row.toLong)).toDF 

    // register the table and then query for your desired percentile 
    df.registerTempTable("table") 
    sqlContext.sql("SELECT PERCENTILE(value, 0.5) FROM table").show() 

Welche gibt 2, der Median zurück. Wenn Sie möchten, dass das erste Quartil nur 0,25 zu PERCENTILE übergibt:

sqlContext.sql("SELECT PERCENTILE(value, 0.25) FROM table").show() 
+1

Hallo Eric, welche Version von spark hast du benutzt und welchen SQL-Kontext verwendest du? Ist es spark sqlcontext oder hive sqlcontext kannst du Import-Anweisungen auch teilen –