Scala - 没有Hive的Spark SQLContext数据帧的第一个四分位数,第三个四分位数和IQR

时间:2016-05-04 15:56:08

标签: scala apache-spark-sql

我有一个数据框:

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|
+--------+------+------------------+

如果不使用Hive,我想获得第一个四分位数,第二个四分位数和IQR(四分位数间距)列为“mean”。

其他解决方案似乎使用了每个人都无法访问的Hive。

Hive Solution 1

Hive Solution 2

Solution for Python

1 个答案:

答案 0 :(得分:1)

我想首先注意,这似乎是一个相当昂贵的解决方案,但我正是我想要的,而不是使用Hive。如果你能够使用Hive肯定会这样做,因为它不会更容易。

我最终使用了commons-math3 jar。使用它的技巧是将数据从数据帧中取出并放入一个数组供math3库使用。我从HERE解决了这个问题。您可能必须根据列的数据类型使用“asInstanceOf”。

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