• hive 分位数函数 percentile(col, p)


    注意在偶数情况下,中位数会存在小数,特别注意!

    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的时候很快就能跑出来了.

    转自:https://blog.csdn.net/sinat_27339001/article/details/52189843

    -------------------------------------------------------

    中位数函数: percentile
    语法: percentile(BIGINT col, p) 
    返回值: double
    说明: 求准确的第pth个百分位数,p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点数类型
    举例:


    中位数函数: percentile
    语法: percentile(BIGINT col, array(p1 [, p2]…)) 
    返回值: array<double>
    说明: 功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array<double>,其中为对应的百分位数。
    举例:
    select percentile(score,<0.2,0.4>) from udftest; 取0.2,0.4位置的数据


    近似中位数函数: percentile_approx
    语法: percentile_approx(DOUBLE col, p [, B]) 
    返回值: double
    说明: 求近似的第pth个百分位数,p必须介于0和1之间,返回类型为double,但是col字段支持浮点类型。参数B控制内存消耗的近似精度,B越大,结果的准确度越高。默认为10,000。当col字段中的distinct值的个数小于B时,结果为准确的百分位数
    举例:


    近似中位数函数: percentile_approx
    语法: percentile_approx(DOUBLE col, array(p1 [, p2]…) [, B]) 
    返回值: array<double>
    说明: 功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array<double>,其中为对应的百分位数。
    举例:


    直方图: histogram_numeric
    语法: histogram_numeric(col, b) 
    返回值: array<struct {‘x’,'y’}>
    说明: 以b为基准计算col的直方图信息。
    举例:
    hive> select histogram_numeric(100,5) from dual;
    [{"x":100.0,"y":1.0}]

    示例:中位数、平均数计算方法:

    select
    	avg(t1.price) as avg_price,
            percentile(int(price), 0.5) as mid_price
    from 
            dev.devXXXXX
    group by
            cate_id,
            cate_name;
    

      

  • 相关阅读:
    强弱类型 静态语言 动态语言 || 脚本语言
    mysql版本升级问题处理
    word
    IntelliJ IDEA 插件
    dubbo
    spring源码构建
    zookeeper 本地多线程模拟分布式事务控制及配置中心
    一次性关闭所有的Activity
    可能以后用得到得东西
    Thread.sleep还是TimeUnit.SECONDS.sleep
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/9645829.html
Copyright © 2020-2023  润新知