spark 实现百分位数计算

时间:2025-04-16 08:22:40

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