2016-05-04 4 views
2

Ich habe einen Datenrahmen:Scala - erste Quartil, dritte Quartil und IQR von Funken SqlContext Datenrahmen ohne Hive

data.show() 
+--------+------+------------------+ 
| Count| mean|    stdev| 
+--------+------+------------------+ 
|  5| 6337| 1684.569470220803| 
|  3| 7224| 567.8250904401182| 
|  330| 20280|23954.260831863092| 
|  42| 26586| 32957.9072313323| 
... 
|  49| 23422|21244.094701798418| 
|  4| 36949| 8616.596311769514| 
|  35| 20915|14971.559603562522| 
|  33| 20874|16657.756963894684| 
|  14| 22698|15416.614921307082| 
|  25| 19100| 12342.11627585264| 
|  27| 21879|21363.736895687238| 
+--------+------+------------------+ 

Ohne Hive verwendet, möchte ich das erste Quartil bekommen, im zweiten Quartil und die IQR (Interquartil Bereich) für die Spalte "Mittelwert".

Andere Lösungen scheinen Hive zu verwenden, auf die alle möglicherweise keinen Zugriff haben.

Hive Solution 1

Hive Solution 2

Solution for Python

Antwort

1

ich zuerst möchte beachten, dass dies eine ziemlich teure Lösung zu sein scheint, aber ich habe genau das, was ich wihtout mit Hive wollen. Wenn Sie in der Lage sind, Hive definitiv zu benutzen, tun Sie es, weil es nicht einfacher sein könnte.

Ich endete mit commons-math3 jar. Der Trick bei der Verwendung bestand darin, die Daten aus dem Datenframe und in ein Array zur Verwendung durch die math3-Bibliothek zu bringen. Ich habe das von HERE gelöst. Möglicherweise müssen Sie mit "asInstanceOf" basierend auf dem Datentyp der Spalte spielen.

import org.apache.commons.math3.stat.descriptive._ 

// Turn dataframe column into an Array[Long] 
val mean = data.select("mean").rdd.map(row => row(0).asInstanceOf[Long]).collect() 

// Create the math3 object and add values from the 
// mean array to the descriptive statistics array 
val arrMean = new DescriptiveStatistics() 
genericArrayOps(mean).foreach(v => arrMean.addValue(v)) 

// Get first and third quartiles and then calc IQR 
val meanQ1 = arrMean.getPercentile(25) 
val meanQ3 = arrMean.getPercentile(75) 
val meanIQR = meanQ3 - meanQ1 
Verwandte Themen