spark 实现百分位数计算

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))
计算百分位数的函数
具体参数 参看:
https://blog.csdn.net/sinat_27339001/article/details/52189843
二.自定义 spark core 计算百分位数方法 当做工具使用
具体代码实现:

/**
* 计算 分位数 的分段值
*
* @param data : rdd
* @param tile : 分位数
* @return 分段值
*/

def computePercentile(data: RDD[Double], tile: Double): Double = {

if (!data.isEmpty()) {
  val r = data.sortBy(x => x)
  val c = r.count()
  if (c == 1) r.first()
  else {
    val n = (tile / 100d) * (c + 1d)
    val k = math.floor(n).toLong
    val d = n - k
    if (k <= 0) r.first()
    else {
      val index = r.zipWithIndex().map(_.swap)
      val last = c
      if (k >= c) {
        index.lookup(last - 1).head
      } else {
        index.lookup(k - 1).head + d * (index.lookup(k).head - index.lookup(k - 1).head)
      }
    }
  }
}
else 0

}

参数解释:
data :RDD[(Double)] 需要计算分位数的 RDD,
tile: Double 具体计算的分位数(20,40,60===》20%,40%。。。)
返回值:返回该RDD 的百分位数的 分段值
例如:val segment_arr = Array(utils.computePercentile(mratioRDD, 20),
utils.computePercentile(mratioRDD, 40),
utils.computePercentile(mratioRDD, 60),
utils.computePercentile(mratioRDD, 80),
utils.computePercentile(mratioRDD, 100)
)
返回 一个分段值的 数组:

0.4295004004115095
0.6420823735288389
0.8625984512540754
1.0974667335218444
4.533219776740614

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值