hive计算分位数

本文介绍了Hive中计算分位数的方法,包括percentile和percentile_approx函数的使用,以及如何处理大数据量时的性能问题。通过调整percentile_approx的参数B可以提高计算速度和精度。当需要计算多个分位数时,可以通过数组参数实现,并通过explode函数拆分结果。同时,遇到计算卡顿可能是因为distinct值过多导致的,适当减小B值能加快计算速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值