HiveSQLpercentile和percentile_approx函数计算千分数
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,p3…p1,p2,p3…),即
乐观作文
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]
没法直接⽤啊!再加个转换:五行健身操
explode(percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999))as percentileexplode(percentile_approx(cast(col as doubl
输出结果就长这样了:
percentile
4001
4061
氨气和二氧化氮
实际操作中,发现有时在计算分位数的时候mapper会卡在0%。
前⾯说过,如果distinct的值⼩于B,就会返回精确值,那么个⼈猜测是因为后台执⾏的过程是先做了⼀个lect distinct limit B,然后排
序得到分位数。如果distinct值特别多的情况下,仅仅是去重就是⼀个巨⼤的运算负担,更别说排序了。⽽当把B从10000调到100的时候
很快就能跑出来了。
中位数函数: percentile
愧疚语法: percentile(BIGINT col, p)
返回值: double
说明: 求准确的第pth个百分位数,p必须介于0和1之间,但是col字段⽬前只⽀持整数,不⽀持浮点数类型
中位数函数: percentile
语法: percentile(BIGINT col, array(p1 [, p2]…))
返回值: array<double>
说明: 功能和上述类似,之后后⾯可以输⼊多个百分位数,返回类型也为array<double>,其中为对应的百分位数。
近似中位数函数: 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的直⽅图信息。
举例:500短篇超污多肉推荐
with的反义词hive> lect histogram_numeric(100,5) from dual;
[{"x":100.0,"y":1.0}]
⽰例:中位数、平均数计算⽅法:
lect
电饭锅盐焗鸡avg(t1.price) as avg_price,
percentile(int(price), 0.5) as mid_price
from
dev.devXXXXX
group by
cate_id,
cate_name;