hive里面倒是有个percentile函数和percentile_approx函数,其使用方式为percentile(col, p)、percentile_approx(col, p),
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}]
精彩评论