spark实现百分位数计算
工作需要 要计算百分位数 但是 spark core 不支持计算 百分位数
一.可以使用 spark sql 计算 但是 他操作起来 很不方便
select percentile_approx(tb_sku.sku_stddv,cast(array(0.2, 0.40, 0.60, 0.80) as array)) from tb_sku
其中 percentile_approx(tb_sku.sku_stddv,cast(array(0.2, 0.40, 0.60, 0.80) as array))
计算百分位数的函数
具体参数 参看:
/sinat_27339001/article/details/52189843
二.自定义 spark core 计算百分位数方法 当做工具使用
具体代码实现:
/**
* 计算 分位数 的分段值
*
* @param data : rdd
* @param tile : 分位数
* @return 分段值
*/
def computePercentile(data: RDD[Double], tile: Double): Double = {
if (!()) {
val r = (x => x)
val c = ()
if (c == 1) ()
else {
val n = (tile / 100d) * (c + 1d)
val k = (n).toLong
val d = n - k
if (k <= 0) ()
else {
val index = ().map(_.swap)
val last = c
if (k >= c) {
(last - 1).head
} else {
(k - 1).head + d * ((k).head - (k - 1).head)
}
}
}
}
else 0
}
参数解释:
data :RDD[(Double)] 需要计算分位数的 RDD,
tile: Double 具体计算的分位数(20,40,60===》20%,40%。。。)
返回值:返回该RDD 的百分位数的 分段值
例如:val segment_arr = Array((mratioRDD, 20),
(mratioRDD, 40),
(mratioRDD, 60),
(mratioRDD, 80),
(mratioRDD, 100)
)
返回 一个分段值的 数组:
0.4295004004115095
0.6420823735288389
0.8625984512540754
1.0974667335218444
4.533219776740614