zoukankan      html  css  js  c++  java
  • hive计算分位数

    hive里面倒是有个percentile函数和percentile_approx函数,其使用方式为percentile(col, p)、percentile_approx(col, p),p(0,1)p∈(0,1) 
    其中percentile要求输入的字段必须是int类型的,而percentile_approx则是数值类似型的都可以 
    其实percentile_approx还有一个参数B:percentile_approx(col, p,B),参数B控制内存消耗的近似精度,B越大,结果的准确度越高。默认为10,000。当col字段中的distinct值的个数小于B时,结果为准确的百分位数。 
    如果我要求多个分位数怎么办呢?,可以把p换为array(p1,p2,p3p1,p2,p3…),即

     
    percentile_approx(col,array(0.05,0.5,0.95),9999)percentile_approx(col,array(0.05,0.5,0.95),9999)


    如果不放心的话,就给col再加个转换: 

     
    percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999)percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999)


    其输出结果长这样:

     
    [0.0,4001.0,4061.0][0.0,4001.0,4061.0]


    没法直接用啊!再加个转换:

     
    explode(percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999))as percentileexplode(percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999))as percentile


    输出结果就长这样了:

    percentile
    0
    4001
    4061

    实际操作中,发现有时在计算分位数的时候mapper会卡在0%。 
    前面说过,如果distinct的值小于B,就会返回精确值,那么个人猜测是因为后台执行的过程是先做了一个select distinct limit B,然后排序得到分位数。如果distinct值特别多的情况下,仅仅是去重就是一个巨大的运算负担,更别说排序了。而当把B从10000调到100的时候很快就能跑出来了

  • 相关阅读:
    每日日报
    Serverless 架构模式及演进
    媒体声音|阿里云数据库:一站式全链路数据管理与服务,引领云原生2.0时代
    贾扬清谈云原生让数据湖加速迈入3.0时代
    阿里巴巴首席技术官程立:我们相信并正在践行的“好科技”
    Delphi外挂制作
    delphi获取汉字拼音首字母
    扫雷外挂的设计与实现
    access和SQL语句的区别
    调用C语言编写的DLL文件
  • 原文地址:https://www.cnblogs.com/fujian-code/p/8798409.html
Copyright © 2011-2022 走看看